2

それがどのように機能するかを修正できますか?トランザクション アノテーションでマークされたメソッド。インターセプトされたときに DB トランザクションが開かれ、Spring トランザクションの両方でコミットされます。また、そのようなメソッドが完了していない間、DB 内の関連するすべてのリソースがロックされたままになります。たとえば、トランザクション メソッドでは、DB からいくつかのエンティティを取得し、それらの一部を複数回更新または削除しました。これはすべてSpringトランザクションで発生しており、DBトランザクションは必要なロックを伴うトランザクションメソッドの最後でのみ発生します??? メソッドがデッドロックなどでハングした場合、ロックされたリソースは DB 内の他のリソースに対してロックされたままになりますか? 私が見るように、はい..

DB (postgresql) state:

30179 | username  | 00:23:05.688157 | IDLE in transaction
6739  | username  | 00:23:13.02717  | IDLE in transaction                
6748  | username  | 00:23:15.266922 | IDLE in transaction
25595 | username  | 00:23:22.382349 | IDLE in transaction
25595 | username  | 00:23:22.382349 | IDLE in transaction 

それらのすべてがロックを保持していました (23、21、20、5、6)。これはどのように起こりますか?私は長い手術をしていません。デッドロックのみ :D しかし、これは起こるべきではありません!! そのため、いくつかのトランザクション メソッドがハングしたが、リソースがロックされたままになっていることがわかりました。これにより、他のトランザクションまたは次のトランザクションが停止し、ロックされたリソースを待機し、すべてのシステムが動作を停止しました...

4

1 に答える 1

1

それはすべて春とは関係のない、「通常の」取引です。

トランザクションの正確な意味は、使用するトランザクション分離レベルに大きく依存します。

「あなた」が で注釈付けされたメソッドを入力すると@Transactional、DB レベルでトランザクションが開始されます (または、少なくとも次の SQL ステートメントが実行される場合)。そのメソッドを終了すると、トランザクションがコミットされます。

注釈には、現在の@Transactionalスレッドのトランザクションがすでに存在する場合に何をすべきかを制御するパラメーターがあります

于 2012-01-05T10:53:03.803 に答える