「MyBatisで行ロック(悲観ロック)を行うには?」の版間の差分

提供: tknotebook
移動: 案内検索
(行ロック(悲観ロック)は単純にやってもうまくゆかない)
(うまくゆかない理由)
 
(1人の利用者による、間の5版が非表示)
17行: 17行:
 
==うまくゆかない理由==
 
==うまくゆかない理由==
  
多くのデータベースの既定のアイソレーションレベルは READ COMMITED です。
+
多くのデータベースの既定のトランザクションのアイソレーションレベルは READ COMMITED です。
  
READ COMMITEDでは行ロックの寿命はカーソルがその行に留まっている間です、しかし、MyBatis は select ステートメント
+
READ COMMITEDでは通常行ロックの寿命は、カーソルがその行に留まっている間です、しかし、
を実行すると、カーソルも PreparedStatement もクローズしてしまいます。これでは行ロックが残る訳が有りません。
+
'''MyBatis は select ステートメントを実行すると、カーソルも PreparedStatement もクローズしてしまいます'''。
 +
これでは行ロックが残る訳が有りません。
  
 
==対処法==
 
==対処法==
  
アイソレーションレベルを REPEATABLE_READ にします。
+
'''トランザクションのアイソレーションレベルを REPEATABLE_READ にします'''。
アイソレーションレベルが REPEATABLE_READ なら、行ロックの寿命はトランザクションの終了(commit/rollback)までです。
+
トランザクションのアイソレーションレベルが REPEATABLE_READ なら、行ロックの寿命はトランザクションの終了(commit/rollback)までです。
  
アイソレーションレベルは
+
トランザクションのアイソレーションレベルは
 
SqlSessionFactory#openSession の引数で指定できます。
 
SqlSessionFactory#openSession の引数で指定できます。

2016年11月19日 (土) 13:03時点における最新版

メインページ>コンピュータの部屋#Java>MyBatis Tips


この記事では MyBatis で行ロックを使う方法を紹介します。

行ロック(悲観ロック)は単純にやってもうまくゆかない

テーブルの行を select ・・・ for update で行ロックして update 文で更新するのは SQL の 「悲観ロック」 の常とう手段です。

ただ、MyBatis では selecetステートメント(Mapperインターフェースの select用メソッド)で select ・・・ for update を実行し、 updateステートメント(Mapperインターフェースの update用メソッド)で行を更新してもうまくゆかないことが多いです。

何故でしょう?

うまくゆかない理由

多くのデータベースの既定のトランザクションのアイソレーションレベルは READ COMMITED です。

READ COMMITEDでは通常行ロックの寿命は、カーソルがその行に留まっている間です、しかし、 MyBatis は select ステートメントを実行すると、カーソルも PreparedStatement もクローズしてしまいます。 これでは行ロックが残る訳が有りません。

対処法

トランザクションのアイソレーションレベルを REPEATABLE_READ にします。 トランザクションのアイソレーションレベルが REPEATABLE_READ なら、行ロックの寿命はトランザクションの終了(commit/rollback)までです。

トランザクションのアイソレーションレベルは SqlSessionFactory#openSession の引数で指定できます。