Блокировка потока приложения для чтения БД во время выполнения другой транзакции - PullRequest
0 голосов
/ 07 сентября 2018

У меня многопоточное приложение, работающее на нескольких арендаторах (отдельные физические блоки).Одна из функциональных возможностей заключается в обновлении сальдо для клиента в этом сценарии, если есть две транзакции Tr1 и Tr2, приходящие на отдельных арендаторов в одно и то же время t1, тогда не корректно обновляются сальдо.я не могу синхронизировать это, поскольку это мультитенант, поэтому границы - это JVM на одной машине.

Технологии: Spring, hibernate и MS SQL.

Я хочу заблокировать поток приложения tr2 (поток наарендатору 1) прочитать данные (конечно, для того же клиента) и обработать их, если поток tr1 (поток на другом арендаторе) уже работает с ними.

1 Ответ

0 голосов
/ 07 сентября 2018

Вы можете использовать один из двух подходов:

Оптимистическая блокировка: JPA не будет создавать дополнительные блокировки, но будет использовать столбец версии, чтобы убедиться, что значение, которое оно обновляет, совпадает с исходной загрузкой и выдает исключение, если это не так.

Вы можете просто включить это, добавив атрибут версии, то есть столбец с аннотацией @Version. Конечно, вам придется поймать полученный результат OptimisticLockException и действовать соответствующим образом (возможно, пытаясь снова).

Пессимистическая блокировка: JPA создаст блокировку строки базы данных, поэтому ничто не сможет изменить ее, пока JPA не завершит работу.

См. справочную документацию Spring Data JPA .

Вот связанный вопрос о том, как этого добиться .

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