Как обрабатывать несколько транзакций, которые создают строки, которые зависят от статуса предыдущих записей? - PullRequest
0 голосов
/ 11 июня 2019

Итак, у меня есть конечная точка Rest для создания записи в БД, я использую шаблон Unit of work.

Перед созданием этой записи код проверяет наличие «активной» записи в БД и устанавливает ее в «неактивный» (это просто столбец) перед созданием новой записи.

Код для создания этой записи используется внутри приложения и также доступен из внешних служб с использованием конечной точки.

Проблема в том, что я продолжаю получать более 1 записи со статусом «активный» в моей базе данных.

Иногда кажется, что в этот код попадают несколько транзакций (возможно, вызов из приложения, а другой - из внешнего сервиса через конечную точку), и когда одна из транзакций проверяет наличие «активных» записей вБД, чтобы установить их как "неактивные", другая транзакция все еще не зафиксирована, поэтому я получаю 2 активные записи.

Поможет ли мне в этом случае использование пессимистической блокировки?

1 Ответ

0 голосов
/ 12 июня 2019

Да наверняка поможет пессимистическая блокировка!

Если вы выполните select for update, другая транзакция не сможет прочитать эту запись.

Но вы должны быть осторожны, потому что некоторые СУБД несделайте блокировку строки, но что-то вроде блокировки страницы, и она может заблокировать больше, чем строку.

Таким образом, транзакция должна быть максимально короткой.

...