«SELECT ... FOR UPDATE» не работает для Hibernate и MySQL - PullRequest
5 голосов
/ 15 февраля 2010

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

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

Спасибо

Ответы [ 3 ]

1 голос
/ 13 марта 2010

Когда у меня были похожие проблемы, это было из-за неправильной настройки транзакций, управляемых 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. Поднимайтесь до тех пор, пока не достигнете своего @Transactional класса / метода. Вы должны увидеть прокси аспекта Spring при следующем вызове в стеке вызовов.

1 голос
/ 03 марта 2010

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

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

0 голосов
/ 02 июня 2011

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

...