Пессимистическая блокировка с Hibernate и DB2 (и Derby)? - PullRequest
0 голосов
/ 24 октября 2011

Имея следующий код:

@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 все еще проходит и читает объект из базы данных ...

Ответы [ 3 ]

1 голос
/ 25 октября 2011

Это то, что я сделал для блокировки объекта:

if (object != null && getSession().getCurrentLockMode(object) != LockMode.UPGRADE) {
    getSession().refresh(object, LockMode.UPGRADE);
}

Уровень изоляции SERIALIZABLE - это самый высокий уровень изоляции, и он очень дорогой, поскольку все транзакции будут выполняться последовательно.Поэтому вы должны убедиться, что он вам действительно нужен, прежде чем его использовать.

0 голосов
/ 09 марта 2012

Смотрите здесь:

https://forum.hibernate.org/viewtopic.php?p=2356502

Предлагает создать подкласс DerbyDialect и переопределить метод getForUpdateString ().

Это работает для меня, хотя и со старой версией Hibernate (3.3.2.GA).

0 голосов
/ 24 октября 2011

Попробуйте добавить isolation=SERIALIZABLE в аннотацию.

...