質問編集履歴

3

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

2019/11/18 16:08

投稿

nakashi
nakashi

スコア11

test CHANGED
File without changes
test CHANGED
@@ -1,56 +1,24 @@
1
1
  MySQLのトランザクション中の挙動について理解できていない所があり、投稿致しました。
2
2
 
3
- 下記の「test」テーブルにPHPプログラムを実行しています。
4
-
5
- (トランザクション開始後、delete、select、insert、コミット)
6
-
7
- 実行testテーブルを覗くと、「tanakaさん2行登録されていて、意図しない結果になってしまいます。
3
+ 下記に、「実行環境」「使用テーブル、「実行結果、「私期待してい結果」、「PHPプログラム」を示します。
8
4
 
9
5
 
10
6
 
11
- 私自身どうも良く分かっていない、スナップショットやトランザクション分離レベルの辺りの話なのでしょうか?
7
+ PHPプログラム実行後、「tanaka」さんが二つ登録されています(下記「実行結果」ご参照)
12
8
 
13
- よろければ、こう挙動になる理由や回避策(トランザクションをければ良いでしょう?)て教えて頂ければ嬉しいです。
9
+ これは下記の「私が期待いた結果」反していて不思議に感じています。また何故このよう結果になのか分からず悩んです。
14
10
 
15
11
 
16
12
 
17
-
18
-
19
- testテーブル(InnoDB、isolation:REPEATABLE-READ、id:auto_increment)
13
+ よろしければ、こういった結果になる理由や、私が期待していた結果にするための方法について教えて頂ければ嬉しいです。
20
-
21
- id name
22
-
23
- 1 sato
24
-
25
- 2 suzuki
26
14
 
27
15
 
28
16
 
29
-
30
-
31
- ●PHPプログラム
17
+ ---
32
-
33
- (1)begin transaction
34
-
35
- (2)delete from test where id = 2;
36
-
37
- (3)select * from test;
38
-
39
- (4)insert into test (name) values ('tanaka')
40
-
41
- (5)commit
42
18
 
43
19
 
44
20
 
45
- ●実行後の「test」テーブルの中身
46
-
47
- 1 sato
48
-
49
- 3 tanaka
21
+ **実行環境**
50
-
51
- 4 tanaka
52
-
53
-
54
22
 
55
23
  MySQLバージョン:5.5.38
56
24
 
@@ -58,17 +26,55 @@
58
26
 
59
27
  レンタルサーバ:kagoya
60
28
 
61
-
62
-
63
- ※上記はkagoyaサーバでの挙動なのですが、ローカル環境(Windows、MySQL5.6.24、PHP5.6.8)では思い通りの動作をしており、両者で挙動が違っていて更に悩んでいます。
29
+  
64
30
 
65
31
 
66
32
 
33
+ **使用テーブル(testテーブル)**
34
+
35
+ ※engine:InnoDB、isolation:REPEATABLE-READ、id:auto_increment
36
+
37
+ |id|name|
38
+
67
- ---
39
+ |:--|:--:|
40
+
41
+ |1|sato|
42
+
43
+ |2|suzuki|
68
44
 
69
45
 
70
46
 
47
+
48
+
49
+
50
+
51
+ **実行結果(testテーブル)**
52
+
53
+ |id|name|
54
+
55
+ |:--|:--:|
56
+
57
+ |1|sato|
58
+
59
+ |3|tanaka|
60
+
61
+ |4|tanaka|
62
+
63
+
64
+
65
+ **私が期待していた結果(testテーブル)**
66
+
67
+ |id|name|
68
+
69
+ |:--|:--:|
70
+
71
+ |1|sato|
72
+
73
+ |3|tanaka|
74
+
75
+
76
+
71
- 具体的なPHPプログラム
77
+ **PHPプログラム**
72
78
 
73
79
 
74
80
 
@@ -167,3 +173,7 @@
167
173
  ?>
168
174
 
169
175
  ```
176
+
177
+
178
+
179
+ ※不思議なことにローカル環境(Windows、MySQL5.6.24、PHP5.6.8)では「私が期待していた結果」になっています。ローカル環境とKagoyaサーバ環境で挙動が違っていて更に悩んでいます。

2

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

2019/11/18 16:08

投稿

nakashi
nakashi

スコア11

test CHANGED
File without changes
test CHANGED
@@ -61,3 +61,109 @@
61
61
 
62
62
 
63
63
  ※上記はkagoyaサーバでの挙動なのですが、ローカル環境(Windows、MySQL5.6.24、PHP5.6.8)では思い通りの動作をしており、両者で挙動が違っていて更に悩んでいます。
64
+
65
+
66
+
67
+ ---
68
+
69
+
70
+
71
+ 具体的なPHPプログラム
72
+
73
+
74
+
75
+ ```PHP
76
+
77
+ <?php
78
+
79
+ session_start();
80
+
81
+ require_once('config.php');
82
+
83
+ require_once('functions.php');
84
+
85
+
86
+
87
+ // DB接続
88
+
89
+ $dbh = connectDb();
90
+
91
+
92
+
93
+ // トランザクション開始
94
+
95
+ $dbh->beginTransaction();
96
+
97
+
98
+
99
+ echo 'begin transaction:' . '<br>';
100
+
101
+
102
+
103
+ try {
104
+
105
+
106
+
107
+ $sql = "delete from test
108
+
109
+ where id = :id";
110
+
111
+ $stmt = $dbh->prepare($sql);
112
+
113
+ $ret = $stmt->execute(array(
114
+
115
+ ":id" => 2
116
+
117
+ ));
118
+
119
+
120
+
121
+ $sql = "select * from test";
122
+
123
+ $stmt = $dbh->query($sql);
124
+
125
+ $test = $stmt->fetchAll(PDO::FETCH_ASSOC);
126
+
127
+ echo 'after delete:';
128
+
129
+ var_dump($test);
130
+
131
+
132
+
133
+
134
+
135
+ $sql = "insert into test (name) values (:name)";
136
+
137
+ $stmt = $dbh->prepare($sql);
138
+
139
+ $ret = $stmt->execute(array(
140
+
141
+ ":name" => 'tanaka'
142
+
143
+ ));
144
+
145
+
146
+
147
+ // commit
148
+
149
+ $dbh->commit();
150
+
151
+
152
+
153
+ unset($dbh);
154
+
155
+
156
+
157
+ } catch (PDOException $e) {
158
+
159
+ $dbh->rollBack();
160
+
161
+ die($e->getMessage());
162
+
163
+ }
164
+
165
+
166
+
167
+ ?>
168
+
169
+ ```

1

タグの追加

2019/11/18 13:40

投稿

nakashi
nakashi

スコア11

test CHANGED
File without changes
test CHANGED
File without changes