トランザクションの処理について、色々ネットサーフィンし色々な記事を見ましたが、
自分なりに理解したつもりでしたが、実際に組み込んで試してみた所、
動作に不可解な部分があったので質問させていただきました。
データの整合性を保つため、トランザクションの処理が必要と、サイトを確認しました。
(トランザクションについて調べ、銀行の残高を例にしたサイトでした)
振込の際、銀行Aの減額処理と銀行Bの増額処理が正常に行われてないと、データの整合性が保てない等の内容でした。
現在、こちらのサイトのトランザクション処理を参考に記述しておりますが、
下記動作が正常なのか、確認お願いします。
id は PRIMARY
- クエリ1. (初期データ)
INSERT INTO testtable (id, name) VALUES (1, 'yamada');
- クエリ2. (処理時間稼ぐ為のデータ)
INSERT INTO testtable (id, name) SELECT COALESCE(MAX(id)+1,1), 'kato' FROM testtable;
INSERT INTO testtable (id, name) SELECT COALESCE(MAX(id)+1,1), 'sato' FROM testtable;
......(2,000件程度)
- クエリ3.
INSERT INTO testtable (id, name) SELECT COALESCE(MAX(id)+1,1), 'suzuki' FROM testtable;
当方の認識としては、
『クエリ1のデータ(id:1)が予め入力されており、クエリ2の大量データをトランザクションで処理。
クエリ2の処理に時間かかる場合、クエリ3を実行すると、クエリ2の処理が終わってから実行される。』と、思っておりましたが
実際は、クエリ2の実行・処理中にクエリ3を実行したところ、ID:2として処理が完了し、クエリ2はID:3から連番が振られていました。
上記のトランザクション処理は正しいのか。また、トランザクション処理でおすすめや参考になるサイト等あればお教えいただければ幸いです。
初歩的な質問で申し訳御座いませんが、お願い致します。
動作環境(Xserver)
MariaDB 10.5
PHP 7.4.25
追記:
'SELECT @@GLOBAL.tx_isolation, @@tx_isolation'
REPEATABLE-READ, REPEATABLE-READ
クエリ1,2,3は別セッションとなります(3セッション)
回答2件
あなたの回答
tips
プレビュー