Q1
それほど自信をもって回答できないのですが、いくつかのプロジェクトでJPA(Hibernate) + Spring Dataを利用した経験上から、ご質問にある想定においてほぼ同じ意見です。
違う点は下記に引用させて頂いた文章の
※私は悲観的ロックが成功した時点で、該当データのレコードに対して
※SQLによるSELECT For UPDATEが掛かるため、サーバ2側はSELECTが出来なくなると思っています。
サーバ2側はSELECTが出来なくなるの部分は、私の認識では悲観的ロックが掛かっていた場合、SELECTは可能ですが**ロックの獲得は出来ない(ロックの獲得待ちになる)**というものです。
この点をMySQL 8.0で確認しました。
次のようにMySQL clientを2つ立ち上げ(それぞれをcli-A、cli-Bとします)、ロックを獲得してみます。
cli-A
2つ目のSQL(select ... for update)でロックします。
sql
1// 1)トランザクション開始
2> start transaction;
3Query OK, 0 rows affected (0.00 sec)
4
5// 2)ロック獲得
6> select * from memo where id = 1 for update;
71 row in set (0.00 sec)
8
9// 3)ロックしたデータを更新
10> update memo set title = 'trans1 update' where id = 1;
11Query OK, 1 row affected (0.00 sec)
12Rows matched: 1 Changed: 1 Warnings: 0
13
このままロックした状態で、cli-BからSQLを実行します。
cli-B
2つ目のselect文ではロックが掛かったデータを参照することは可能ですが
3つ目のselect ... for updateでロック獲得待ちになります。(タイムアウトで指定した時間以内にロックが獲得できない場合はタイムアウトします)
sql
1// 1)トランザクション開始
2> start transaction;
3Query OK, 0 rows affected (0.00 sec)
4
5// 2)ロックされているデータを検索
6> select * from memo where id = 1;
71 row in set (0.00 sec)
8
9// 3)ロック獲得 -> ロック獲得待ち
10> select * from memo where id = 1 for update;
11// タイムアウト
12ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
このロックの挙動は基本的にJPA(Hibernate)でも同様という認識でいます。
(ただMySQL clientと完全に同じ挙動かどうかは自信がありません。)
ちなみに、JPA(Hibernate)の悲観的ロックのLockModeTypeによって実行されるSQLが変わりますので、悲観的ロックといってもどちらのモードを使うかによって挙動がかわると思います。
- LockModeType.PESSIMISTIC_READ -> select ... lock in share mode
- LockModeType.PESSIMISTIC_WRITE -> select ... for update
Q2
期待されている情報源として、JPAやHibernate、EclipseLinkなどのORM、Spring Data、MyBatisなどのフレームワーク、ライブラリのリファレンスや、それらの開発者のブログ等の信頼性の高いものだと思いますが、残念ならがご期待に適う情報は持っていませんでした。
強いて挙げれば、下記のサイトになりますが、ご質問の内容に直接関係する内容はなかったように思います。
Hibernate ORM 5.2 Locking
https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/chapters/locking/Locking.html
Pessimistic Locking in JPA
https://www.baeldung.com/jpa-pessimistic-locking
Understanding JDBC Internals & Timeout Configuration
https://www.cubrid.org/blog/understanding-jdbc-internals-and-timeout-configuration
以上、ご参考になれば幸いです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/13 01:58