質問編集履歴
3
指摘を受け、質問内容が分かりやすいように整理しなおしました。
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,40 +1,43 @@
|
|
1
1
|
MySQLのトランザクション中の挙動について理解できていない所があり、投稿致しました。
|
2
|
-
下記の「test」テーブルにPHPプログラムを実行しています。
|
3
|
-
(トランザクション開始後、delete、select、insert、コミット)
|
4
|
-
実行
|
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
|
-
|
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
|
-
|
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
|
-
※
|
18
|
+
※engine:InnoDB、isolation:REPEATABLE-READ、id: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プログラムを追記しました。
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
タグの追加
title
CHANGED
File without changes
|
body
CHANGED
File without changes
|