Имея следующий код:
@Transactional // Spring annotation
public void doStuffWithPayments(...) {
List payments = getCurrentSession().createQuery("select distinct p from Payment p .....")
.setLockMode("p", LockMode.UPGRADE)
.list();
do_stuff(); // Takes an extended amount of time
updatePayments(payments);
}
... генерирует sql как:
select ...... from Payment where ..... for read only with rs
Два параллельных потока вводят метод, пытающийся получить доступ к одной и той же записи БД.Поток 1 вступает в действие незадолго до потока 2. Я бы хотел, чтобы поток 2 был вынужден ждать в ".list ()", пока поток 1 не покинет область транзакции и транзакции не будут зафиксированы.
Возможно ли это?
РЕДАКТИРОВАТЬ (после комментария): Пробовал
@Transactional(isolation = Isolation.SERIALIZABLE)
, но оба потока все еще проходят операцию чтения БД.
На последнем БДзапись взаимоблокировки в базу данных происходит.
EDIT2 Я получаю то же поведение, используя Derby.
Также пытался установить блокировку в соответствии с предложением:
getCurrentSession().refresh(object, LockMode.UPGRADE);
Поток 2 все еще проходит и читает объект из базы данных ...