Почему Spring @Transactional перестает извлекать элемент из очереди блокировки? - PullRequest
0 голосов
/ 06 июля 2019

Я использую BlockingQueue для передачи элементов от поставщика к потребителю, и он отлично работает.

Чтобы откатить операции с базой данных при возникновении исключений, я добавляю аннотацию @Transactional (rollbackFor = Exception.class)к функции провайдера.Неожиданно это останавливает потребителя от чтения любых элементов из очереди.

Поставщик всегда может успешно поместить элемент в очередь, но потребитель никогда не сможет извлечь элемент из очереди.

Удаление аннотации @Transactional или помещение элементов в очередь вне помеченного метода @Transactional устранят проблему.

Вот псевдокод Java

blockingQueue = new BlockingQueue();
// consumer code
while (true) {
    // take a element
    blockingQueue.take();
}

// provider code
// after removing the annotation the consumer works fine
@Transactional(rollbackFor = Exception.class)
provideElement() {
    // put a element
    blockingQueue.put();
}

Я обхожу проблему, перемещая метод put из фрагмента кода @Transactional.Но мне все еще любопытно: почему добавление аннотации @Trasactional мешает потребителю брать элементы из очереди блокировки?

...