「MyBatisで行ロック(悲観ロック)を行うには?」の版間の差分
提供: tknotebook
(ページの作成:「Category:コンピュータCategory:JavaCategory:MyBatis メインページ>コンピュータの部屋#Java>MyBatis Tips ==悲観ロック...」) |
(→うまくゆかない理由) |
||
(1人の利用者による、間の7版が非表示) | |||
2行: | 2行: | ||
[[メインページ]]>[[コンピュータの部屋#Java]]>[[MyBatis Tips]] | [[メインページ]]>[[コンピュータの部屋#Java]]>[[MyBatis Tips]] | ||
− | == | + | |
+ | この記事では MyBatis で行ロックを使う方法を紹介します。 | ||
+ | |||
+ | ==行ロック(悲観ロック)は単純にやってもうまくゆかない== | ||
テーブルの行を select ・・・ for update で行ロックして update 文で更新するのは | テーブルの行を select ・・・ for update で行ロックして update 文で更新するのは | ||
8行: | 11行: | ||
ただ、MyBatis では selecetステートメント(Mapperインターフェースの select用メソッド)で select ・・・ for update を実行し、 | ただ、MyBatis では selecetステートメント(Mapperインターフェースの select用メソッド)で select ・・・ for update を実行し、 | ||
− | updateステートメント(Mapperインターフェースの update用メソッド) | + | updateステートメント(Mapperインターフェースの update用メソッド)で行を更新しても'''うまくゆかないことが多い'''です。 |
+ | |||
+ | 何故でしょう? | ||
==うまくゆかない理由== | ==うまくゆかない理由== | ||
− | + | 多くのデータベースの既定のトランザクションのアイソレーションレベルは READ COMMITED です。 | |
− | READ | + | READ COMMITEDでは通常行ロックの寿命は、カーソルがその行に留まっている間です、しかし、 |
− | + | '''MyBatis は select ステートメントを実行すると、カーソルも PreparedStatement もクローズしてしまいます'''。 | |
+ | これでは行ロックが残る訳が有りません。 | ||
==対処法== | ==対処法== | ||
− | + | '''トランザクションのアイソレーションレベルを REPEATABLE_READ にします'''。 | |
− | + | トランザクションのアイソレーションレベルが 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 の引数で指定できます。