У меня проблема с контролем параллелизма при вставке данных через мое веб-приложение.
Контекст: у меня есть 3 таблицы (X, Y и Z), которые регистрируют госпитализации пациентов.Пациент не может иметь более одной активной госпитализации.
В настоящее время мое приложение выполняет проверку перед вставкой госпитализации INSERT в базу данных, которая проверяет, находится ли пациент уже в больнице.
Однако эта проверка действительноне работает, когда два или более пользователей пытаются принять одного и того же пациента в одно и то же время.
Что я делаю сейчас:
1 - verify if patient is already hospitalized (SELECT in table X)
If not:
begin transaction A;
2 - INSERT in table X;
3 - INSERT in table Y;
4 - INSERT in table Z;
end transaction A;
Как я упоминал ранее, проверка в 1 пытается избежатьпациентов от госпитализации дважды или более.Однако это не работает, если два (или более) пользователя пытаются одновременно принять одного и того же пациента.
Может быть, я могу использовать что-то, что может заблокировать выполнение инструкции SELECT до завершения транзакции A,Таким образом, SELECT идентифицирует, что пациент уже зарегистрирован при выполнении.
Я бы хотел решить эту проблему, используя EXPLICITING LOCKING из PostgreSQL в базе данных.В соответствии с документацией, я могу сделать что-то подобное, используя режим блокировки ACCESS EXCLUSIVE (поскольку это единственный режим, способный заблокировать оператор выбора).
Но как реализовать эту блокировку ACCESS EXCLUSIVE в Hibernate??
Я уже проверил и не могу обработать это, используя ограничения в базе данных