Spring Data JPA — лучший способ обновить общее поле с одновременным доступом

(Используя Spring Boot 2.3.3 с MySQL 8.0.)

Допустим, у меня есть объект Account, который содержит поле total, и один из этих объектов учетной записи представляет некую основную учетную запись. т.е. что поле total основного аккаунта обновляется почти при каждой транзакции, и важно, чтобы любые обновления этого поля total производились с использованием самого последнего значения.

Что лучше выбрать в рамках такой сделки:

  1. Используя блокировку PESSIMISTIC_WRITE, выберите главный аккаунт, увеличьте значение поля total и зафиксируйте транзакцию. Или,

  2. У вас есть специальный запрос, который, по сути, делает что-то вроде UPDATE Account SET total = total + x как часть транзакции? Я предполагаю, что в этом случае мне все равно понадобится такая же пессимистическая блокировка для запроса UPDATE, например. через @Query и @Lock.

Кроме того, является ли анти-шаблон повторной неудачной транзакции заданное количество раз из-за тайм-аута получения блокировки (или другого исключения на основе блокировки)? Или лучше допустить сбой, сообщить об этом клиенту и позволить клиенту снова попытаться вызвать транзакцию/службу?

Извиняюсь за основной вопрос, но прошло некоторое время с тех пор, как мне приходилось беспокоиться о том, чтобы делать такие вещи весной.

Заранее спасибо!


person BtySgtMajor    schedule 25.09.2020    source источник


Ответы (1)


После того, как я немного потренировался в моем Google Fu и копнул еще глубже, кажется, что варианты этого вопроса уже задавались, по крайней мере, в части «блокировки».

То есть, хотя в документах Spring Data JPA упоминается повторное объявление методов репозитория и добавление аннотации @Lock, кажется, что это предназначено исключительно для запросов, предназначенных только для чтения. Это то, о чем я изначально думал, поскольку не имеет особого смысла блокировать запрос UPDATE, если только с запросом JPQL не произойдет какая-то дополнительная магия.

Что касается повторных попыток, кажется, что повторные попытки — это то, что нужно, но, конечно, с использованием количества повторных попыток, которое имеет смысл в данной ситуации.

Надеюсь, это поможет кому-то еще в будущем, у кого будет судорога мозга, как у меня.

person BtySgtMajor    schedule 29.09.2020