質問編集履歴
3
指摘を受け、質問内容が分かりやすいように整理しなおしました。
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
|
-
実行
|
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
|
-
|
13
|
+
よろしければ、こういった結果になる理由や、「私が期待していた結果」にするための方法について教えて頂ければ嬉しいです。
|
20
|
-
|
21
|
-
id name
|
22
|
-
|
23
|
-
1 sato
|
24
|
-
|
25
|
-
2 suzuki
|
26
14
|
|
27
15
|
|
28
16
|
|
29
|
-
|
30
|
-
|
31
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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プログラムを追記しました。
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
タグの追加
test
CHANGED
File without changes
|
test
CHANGED
File without changes
|