MySQLのトランザクション中の挙動について理解できていない所があり、投稿致しました。
下記に、「実行環境」、「使用テーブル」、「実行結果」、「私が期待していた結果」、「PHPプログラム」を示します。
PHPプログラム実行後、「tanaka」さんが二つ登録されています(下記「実行結果」ご参照)
これは下記の「私が期待していた結果」に反していて不思議に感じています。また何故このような結果になるのか分からずに悩んでいます。
よろしければ、こういった結果になる理由や、「私が期待していた結果」にするための方法について教えて頂ければ嬉しいです。
実行環境
MySQLバージョン:5.5.38
PHPバージョン:5.5.29
レンタルサーバ:kagoya
使用テーブル(testテーブル)
※engine:InnoDB、isolation:REPEATABLE-READ、id:auto_increment
id | name |
---|---|
1 | sato |
2 | suzuki |
実行結果(testテーブル)
id | name |
---|---|
1 | sato |
3 | tanaka |
4 | tanaka |
私が期待していた結果(testテーブル)
id | name |
---|---|
1 | sato |
3 | tanaka |
PHPプログラム
PHP
1<?php 2session_start(); 3require_once('config.php'); 4require_once('functions.php'); 5 6// DB接続 7$dbh = connectDb(); 8 9// トランザクション開始 10$dbh->beginTransaction(); 11 12echo 'begin transaction:' . '<br>'; 13 14try { 15 16 $sql = "delete from test 17 where id = :id"; 18 $stmt = $dbh->prepare($sql); 19 $ret = $stmt->execute(array( 20 ":id" => 2 21 )); 22 23 $sql = "select * from test"; 24 $stmt = $dbh->query($sql); 25 $test = $stmt->fetchAll(PDO::FETCH_ASSOC); 26 echo 'after delete:'; 27 var_dump($test); 28 29 30 $sql = "insert into test (name) values (:name)"; 31 $stmt = $dbh->prepare($sql); 32 $ret = $stmt->execute(array( 33 ":name" => 'tanaka' 34 )); 35 36 // commit 37 $dbh->commit(); 38 39 unset($dbh); 40 41} catch (PDOException $e) { 42 $dbh->rollBack(); 43 die($e->getMessage()); 44} 45 46?>
※不思議なことにローカル環境(Windows、MySQL5.6.24、PHP5.6.8)では「私が期待していた結果」になっています。ローカル環境とKagoyaサーバ環境で挙動が違っていて更に悩んでいます。
回答3件
あなたの回答
tips
プレビュー