Эксклюзивная блокировка строк в SQL Server (XLOCK ROWLOCK) с использованием транзакций Spring с использованием Hibernate - PullRequest
0 голосов
/ 19 октября 2011

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

@Transactional(isolation = Isolation.SERIALIZABLE, readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Exception.class, timeout=960)

Это определенно работает в контексте Spring, но, помещая оператор сна в середине транзакции, я все еще могу выбрать текущее значение строки, используяинструмент базы данных.

Есть ли способ получить XLOCK / ROWLOCK (в зависимости от того, что подходит), используя Spring / Hibernate?

Версии:

  • Spring: 3.0.5.RELEASE
  • Hibernate: 3.6.3.Final
  • JTDS: 1.2.4

Если я не могу использоватьSpring / Hibernate, ссылка на пример JTDS была бы очень признательна.

Спасибо.

Ответы [ 2 ]

4 голосов
/ 22 октября 2011

SERIALIZABLE уровень изоляции позволяет другим транзакциям читать данные, но не изменять.Так что вам нужно явно SELECT ... FOR UPDATE (в Hibernate: Query#setLockMode(LockMode.UPGRADE)).

2 голосов
/ 22 октября 2011

Использовать явную блокировку с Hibernate.Здесь больше информации здесь .

Тем не менее, я думаю, вы должны подумать еще раз - вам действительно нужен пессимистический замок?В большинстве случаев оптимистическая блокировка работает лучше, а hibernate очень хорошо поддерживает управление версиями.

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