"SELECT ... FOR UPDATE" не работает для Hibernate и MySQL

У нас есть система, в которой мы должны использовать пессимистическую блокировку в одном объекте. Мы используем hibernate, поэтому мы используем LockMode.UPGRADE. Тем не менее, он не блокируется.

  • Столы InnoDB
  • Мы проверили, что блокировка работает правильно в базе данных (5.0.32), поэтому эта ошибка http://bugs.mysql.com/bug.php?id=18184 похоже, не является проблемой.
  • Мы проверили, что источник данных включает в себя autoCommit = false параметр.
  • Мы проверили, что в спящем SQL (версия 3.2) генерируется " FOR UPDATE".

Спасибо,

3 ответа

Я сталкиваюсь с чем-то очень похожим. Я использую аннотацию @Transactional в Spring и выдаю выбор для обновления, а блокировка обновления не получается (у меня есть другие потоки, которые выдают такой же выбор для обновления, и проверили, что они не блокируются на замок). Когда я явно получаю сеанс Hibernate и запускаю beginTransaction и фиксирую вокруг блока кода, все это работает.

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

Когда у меня были похожие проблемы, это было из-за неправильной настройки транзакций, управляемых Spring. Дважды проверьте конфигурацию Spring tx.

<tx:annotation-driven transaction-manager="txManager"/>
<bean id="txManager" class="org.springframework.orm.hibernate.HibernateTransactionManager">
  <property name="sessionFactory" ref="sessionFactory" />
</bean>

Тот факт, что вам нужно autocommit = false может также указывать, что вы не работаете в рамках транзакции. Вы также получаете ленивые исключения инициализации, когда пытаетесь получить доступ к коллекциям "один ко многим"?

Самый прямой способ выяснить, действительно ли работает аспект Spring tx, - это использовать отладчик. Поместите точку останова в метод, который выдает FOR UPDATE SQL. Upstack, пока вы не ударили @Transactional класс / метод. Вы должны увидеть прокси аспекта Spring в следующем вызове в стеке вызовов.

В последнее время у меня была такая проблема. Когда мы работали с 2 менеджерами tx, потому что у нас были разные базы данных, и проблема заключалась в том, что транзакция использовала tx manager, настроенный для другой базы данных, и из-за этого при подключении к запрашиваемой базе данных не отключался режим автоматической фиксации перед выполнением выбора. для обновления. Использование правильного tx manager решило эту проблему. Надеюсь, что это поможет другим в будущем.

Другие вопросы по тегам