(Используя Spring Boot 2.3.3 с MySQL 8.0.)
Допустим, у меня есть объект Account
, который содержит поле total
, и один из этих объектов учетной записи представляет некую основную учетную запись. т.е. что поле total
основного аккаунта обновляется почти при каждой транзакции, и важно, чтобы любые обновления этого поля total
производились с использованием самого последнего значения.
Что лучше выбрать в рамках такой сделки:
Используя блокировку
PESSIMISTIC_WRITE
, выберите главный аккаунт, увеличьте значение поля total и зафиксируйте транзакцию. Или,У вас есть специальный запрос, который, по сути, делает что-то вроде
UPDATE Account SET total = total + x
как часть транзакции? Я предполагаю, что в этом случае мне все равно понадобится такая же пессимистическая блокировка для запроса UPDATE, например. через@Query
и@Lock
.
Кроме того, является ли анти-шаблон повторной неудачной транзакции заданное количество раз из-за тайм-аута получения блокировки (или другого исключения на основе блокировки)? Или лучше допустить сбой, сообщить об этом клиенту и позволить клиенту снова попытаться вызвать транзакцию/службу?
Извиняюсь за основной вопрос, но прошло некоторое время с тех пор, как мне приходилось беспокоиться о том, чтобы делать такие вещи весной.
Заранее спасибо!