EJB、JPA、実装として Hibernate を使用する Glassfish 3.0.1 で実行されている Java EE アプリがあり、データベース エンジンとして MS SQL Server 2008 R2、JTDS を JDBC ドライバーとして使用しています。すべてのエンティティで @version フィールドを指定することにより、楽観的ロック戦略を選択しました。DB アクセスは同時に行うことができ、JTA トランザクション中に多数の DB 読み取りが要求される場合があります。
私たちは、トランザクションを小さな作業単位に分割することで、トランザクションをできるだけ迅速にしようとしました。
残念ながら、データベース ロックがいつまでも続く状況に陥っています。MS SQL Server アクティビティ モニターから、1 つのトランザクションが他のトランザクションをロックし、その特定のトランザクションは強制終了するまで停止しないことがわかります。ステートメントを見ると、履歴テーブルとは関係のない他のテーブルで単に選択されている他のトランザクションをブロックするのは、履歴テーブルへの挿入です。
最初の質問は、オプティミスティック ロック戦略を採用しているのに、SQL Server がテーブルをロックするのはなぜですか? どうすればその行動を防ぐことができますか?