teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

3

指摘を受け、質問内容が分かりやすいように整理しなおしました。

2019/11/18 16:08

投稿

nakashi
nakashi

スコア11

title CHANGED
File without changes
body CHANGED
@@ -1,40 +1,43 @@
1
1
  MySQLのトランザクション中の挙動について理解できていない所があり、投稿致しました。
2
- 下記の「test」テーブルにPHPプログラムを実行しています。
3
- (トランザクション開始後、delete、select、insert、コミット)
4
- 実行testテーブルを覗くと、「tanakaさん2行登録されていて、意図しない結果になってしまいます。
2
+ 下記に、「実行環境」「使用テーブル、「実行結果、「私期待してい結果」、「PHPプログラム」を示します。
5
3
 
6
- 私自身どうも良く分かっていない、スナッショットやトンザクション分離レベルの辺りの話なのでしょうか?
4
+ PHPログム実行後、「tanaka」さんが二つ登録されています(下記「実行結果」ご参照)
7
- よろしければ、挙動なる理由や回避策(トランザクションを分ければ良いでょうか?)について教え頂ければ嬉しいです。
5
+ れは下記の「私が期待していた結果」いて不思議に感じています。また何故このような結果になるのか分からずに悩んいます。
8
6
 
7
+ よろしければ、こういった結果になる理由や、「私が期待していた結果」にするための方法について教えて頂ければ嬉しいです。
9
8
 
10
- ●「test」テーブル(InnoDB、isolation:REPEATABLE-READ、id:auto_increment)
11
- id name
12
- 1 sato
9
+ ---
13
- 2 suzuki
14
10
 
15
-
16
- ●PHPプログラム
17
- (1)begin transaction
18
- (2)delete from test where id = 2;
19
- (3)select * from test;
20
- (4)insert into test (name) values ('tanaka')
21
- (5)commit
22
-
23
- ●実行後の「test」テーブルの中身
24
- 1 sato
25
- 3 tanaka
11
+ **実行環境**
26
- 4 tanaka
27
-
28
12
  MySQLバージョン:5.5.38
29
13
  PHPバージョン:5.5.29
30
14
  レンタルサーバ:kagoya
15
+  
31
16
 
17
+ **使用テーブル(testテーブル)**
32
- 上記はkagoyaサーバでの挙動なのですがローカル環境(WindowsMySQL5.6.24、PHP5.6.8)では思い通りの動作をしており、両者で挙動が違っていて更に悩んでいます。
18
+ engine:InnoDBisolation:REPEATABLE-READid:auto_increment
19
+ |id|name|
20
+ |:--|:--:|
21
+ |1|sato|
22
+ |2|suzuki|
33
23
 
34
- ---
35
24
 
36
- 具体的なPHPプログラム
37
25
 
26
+ **実行結果(testテーブル)**
27
+ |id|name|
28
+ |:--|:--:|
29
+ |1|sato|
30
+ |3|tanaka|
31
+ |4|tanaka|
32
+
33
+ **私が期待していた結果(testテーブル)**
34
+ |id|name|
35
+ |:--|:--:|
36
+ |1|sato|
37
+ |3|tanaka|
38
+
39
+ **PHPプログラム**
40
+
38
41
  ```PHP
39
42
  <?php
40
43
  session_start();
@@ -82,4 +85,6 @@
82
85
  }
83
86
 
84
87
  ?>
85
- ```
88
+ ```
89
+
90
+ ※不思議なことにローカル環境(Windows、MySQL5.6.24、PHP5.6.8)では「私が期待していた結果」になっています。ローカル環境とKagoyaサーバ環境で挙動が違っていて更に悩んでいます。

2

具体的なPHPプログラムを追記しました。

2019/11/18 16:08

投稿

nakashi
nakashi

スコア11

title CHANGED
File without changes
body CHANGED
@@ -29,4 +29,57 @@
29
29
  PHPバージョン:5.5.29
30
30
  レンタルサーバ:kagoya
31
31
 
32
- ※上記はkagoyaサーバでの挙動なのですが、ローカル環境(Windows、MySQL5.6.24、PHP5.6.8)では思い通りの動作をしており、両者で挙動が違っていて更に悩んでいます。
32
+ ※上記はkagoyaサーバでの挙動なのですが、ローカル環境(Windows、MySQL5.6.24、PHP5.6.8)では思い通りの動作をしており、両者で挙動が違っていて更に悩んでいます。
33
+
34
+ ---
35
+
36
+ 具体的なPHPプログラム
37
+
38
+ ```PHP
39
+ <?php
40
+ session_start();
41
+ require_once('config.php');
42
+ require_once('functions.php');
43
+
44
+ // DB接続
45
+ $dbh = connectDb();
46
+
47
+ // トランザクション開始
48
+ $dbh->beginTransaction();
49
+
50
+ echo 'begin transaction:' . '<br>';
51
+
52
+ try {
53
+
54
+ $sql = "delete from test
55
+ where id = :id";
56
+ $stmt = $dbh->prepare($sql);
57
+ $ret = $stmt->execute(array(
58
+ ":id" => 2
59
+ ));
60
+
61
+ $sql = "select * from test";
62
+ $stmt = $dbh->query($sql);
63
+ $test = $stmt->fetchAll(PDO::FETCH_ASSOC);
64
+ echo 'after delete:';
65
+ var_dump($test);
66
+
67
+
68
+ $sql = "insert into test (name) values (:name)";
69
+ $stmt = $dbh->prepare($sql);
70
+ $ret = $stmt->execute(array(
71
+ ":name" => 'tanaka'
72
+ ));
73
+
74
+ // commit
75
+ $dbh->commit();
76
+
77
+ unset($dbh);
78
+
79
+ } catch (PDOException $e) {
80
+ $dbh->rollBack();
81
+ die($e->getMessage());
82
+ }
83
+
84
+ ?>
85
+ ```

1

タグの追加

2019/11/18 13:40

投稿

nakashi
nakashi

スコア11

title CHANGED
File without changes
body CHANGED
File without changes