「MyBatisで行ロック(悲観ロック)を行うには?」の版間の差分
提供: tknotebook
								
												
				 (ページの作成:「Category:コンピュータCategory:JavaCategory:MyBatis メインページ>コンピュータの部屋#Java>MyBatis Tips  ==悲観ロック...」)  | 
				|||
| 2行: | 2行: | ||
[[メインページ]]>[[コンピュータの部屋#Java]]>[[MyBatis Tips]]  | [[メインページ]]>[[コンピュータの部屋#Java]]>[[MyBatis Tips]]  | ||
| − | ==  | + | |
| + | この記事では MyBatis で行ロックを使う方法を紹介します。  | ||
| + | |||
| + | ==行ロック(悲観ロック)は単純にやってもうまくゆかない==  | ||
テーブルの行を select ・・・ for update で行ロックして update 文で更新するのは  | テーブルの行を select ・・・ for update で行ロックして update 文で更新するのは  | ||
2016年11月19日 (土) 12:58時点における版
メインページ>コンピュータの部屋#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 の引数で指定できます。