Несогласованность в хранении данных, когда вызов метода асинхронный (@Async) в весеннем спящем проекте - PullRequest
0 голосов
/ 01 марта 2019

У меня есть метод с аннотацией Spring @Async (также Нет @Транзакционная аннотация есть для этого метода).

Я поместил @Transactional в метод, вызываемый этимметод в другом классе.

Все вызовы read выполняются довольно хорошо, но вызов write не согласован.И также я не вижу никакой ошибки всякий раз, когда вызов hibernate не сохраняет и не откатывает.

Проблеск кода, который я написал:

Class CallbackService{
....

@Async
public void processCallback(...){
myService.performTask(...);
...
}
}
Class MyService{

@Transactional
public void performTask(){
.....//read-call //working as expected

mydao.saveOrUpdate(...);// write call. Inconsistent. Fails randomly

....//Other task performs well
}
}

Любая помощь будет оценена.Я застрял на этом в течение 2 дней. Я попробовал различные ответы, найденные в Интернете, и ничего не работает.Это все еще терпит неудачу случайно.Пожалуйста, дайте мне знать, если вам нужно что-нибудь еще

1 Ответ

0 голосов
/ 01 марта 2019

Проблема не в асинхронном.Проблема в том, что вы позволяете читать и писать без блокировок несколькими потоками.Вам необходимо заблокировать вашу запись чтения перед обновлением.Но со вставкой все гораздо хуже, потому что вам нужно заблокировать всю таблицу для вставок, чтобы предотвратить двойную вставку.

Попробуйте прочитать о пессимистичных блокировках и блокировках таблиц

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...