5

1 つのエンティティで悲観的ロックを使用する必要があるシステムがあります。休止状態を使用しているため、LockMode.UPGRADE を使用します。ただし、ロックはしません。

  • テーブルは InnoDB です
  • データベース (5.0.32) でロックが正しく機能することを確認したので、このバグhttp://bugs.mysql.com/bug.php?id=18184は問題ないようです。
  • autoCommit = falseデータソースにパラメーターが含まれていることを確認しました。
  • ハイバネート (バージョン 3.2) が生成する SQL に "FOR UPDATE" が含まれていることを確認しました。

ありがとう、

4

3 に答える 3

2

私は非常によく似たものに遭遇しています。Spring で @Transactional アノテーションを使用しており、select for update を発行していますが、更新ロックが取得されていません (同じ select for update を発行している他のスレッドがあり、それらがブロックされていないことを確認しました)。ロック)。Hibernate セッションを明示的に取得して beginTransaction を発行し、コード ブロックをコミットすると、すべてが機能します。

これでは、Spring コンテナー管理のトランザクションについて、あたたかくてぼんやりした感じはしません。

于 2010-03-02T22:04:09.413 に答える
1

同様の問題が発生したとき、それは 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、トランザクション内で操作していないことを示している場合もあります。1 対多のコレクションにアクセスしようとすると、遅延初期化例外も発生しますか?

Spring tx アスペクトが実際に機能しているかどうかを確認するために私が見つけた最も直接的な方法は、デバッガーを使用することです。FOR UPDATESQLを発行するメソッドにブレークポイントを置きます。@Transactionalクラス/メソッドに到達するまでアップスタックします。コール スタックの次の呼び出しで、Spring アスペクト プロキシが表示されるはずです。

于 2010-03-13T05:36:01.483 に答える