質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Q&A

解決済

1回答

5198閲覧

コミット前に別トランザクションでAUTO_INCREMENTした場合の挙動は?

flaumig

総合スコア67

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

0グッド

0クリップ

投稿2018/05/08 08:38

編集2018/05/08 08:40

前提

PRIMARY KEYとAUTO_INCREMENTを付けた”ID”カラムを持つテーブルがあります。
このテーブルに対してレコードを登録し、
採番されたIDをもとにフォルダを作成して特定の処理を実行します。
その処理が成功した後に先ほど登録したレコードをコミットしたい、と考えております。
処理が失敗した場合は、テーブルをロールバックする想定です。

質問内容

上記のテーブルに対して下記の順で処理を行った場合、
4番目のinsert処理はすぐに実行されるのでしょうか?
もしくは5番目のコミット or ロールバックが完了されるまで待ち状態になるのでしょうか?

  1. トランザクション1:開始
  2. トランザクション1:レコード(A)をinsert
  3. トランザクション2:開始
  4. トランザクション2:レコード(B)をinsert
  5. トランザクション1:コミット or ロールバック
  6. トランザクション2:コミット or ロールバック

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2018/05/08 08:42

分離レベルは何にしていますか?
flaumig

2018/05/08 08:50

デフォルトの"REPEATABLE-READ"です
guest

回答1

0

ベストアンサー

普通にやっていればトランザクション2のコミットは、トランザクション1のコミット・ロールバックに
かかわらず、トランザクション1でauto_incrementされた前提でidを振ることになるでしょう
つまりトランザクション1がロールバックした場合、トランザクション2のidは連番ではなくなります

たとえば以下のテーブル構造だとして

SQL

1create table tbl(id int not null primary key auto_increment,data int);

PHPからPDOで処理するとき

PHP

1 $pdo1->beginTransaction(); 2 $pdo2->beginTransaction(); 3 $sql="INSERT INTO tbl(data) VALUES(100),(101),(102)"; 4 $stmt = $pdo1->query($sql); 5 $sql="INSERT INTO tbl(data) VALUES(200),(201),(202)"; 6 $stmt = $pdo2->query($sql); 7 $pdo1->rollback(); 8 $pdo2->commit();

だとするとtblは、(4,200),(5,201),(6,202)になります。
極端な話し、pdo2はpdo1を待つ必要はなく以下でも結果は同じです

PHP

1 $pdo1->beginTransaction(); 2 $pdo2->beginTransaction(); 3 $sql="INSERT INTO tbl(data) VALUES(100),(101),(102)"; 4 $stmt = $pdo1->query($sql); 5 $sql="INSERT INTO tbl(data) VALUES(200),(201),(202)"; 6 $stmt = $pdo2->query($sql); 7 $pdo2->commit(); 8 $pdo1->rollback();

※2をコミットしてから1をロールバック

投稿2018/05/08 10:33

yambejp

総合スコア114769

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

flaumig

2018/05/09 02:36

ご回答ありがとうございます! もし、前のトランザクションが終わるまで後続処理が待ち状態になるのであれば、仕様を変更しようと考えていましたが問題ないとのことで安心いたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問