質問編集履歴

1

説明文・コードを追加しました。

2015/10/21 06:23

投稿

just
just

スコア90

test CHANGED
File without changes
test CHANGED
@@ -12,6 +12,130 @@
12
12
 
13
13
 
14
14
 
15
+ test1,test2,test3はあくまで例で、データベースは顧客数分あります(顧客毎にDBを分ける設計)。
16
+
17
+ 当然、保存されているデータはデータベース毎に異なりますが、新機能追加にあたり、
18
+
19
+ データベース定義が変更されることになりました。
20
+
21
+ 手動で変更をかけると人的ミスが起こりうるのでパッチを書くことになった、という経緯があります。
22
+
23
+
24
+
15
25
  調べたところ、データベースをまたがったトランザクションの例はなかなか
16
26
 
17
27
  出てこないのですがPHPで実装可能でしょうか?
28
+
29
+
30
+
31
+ 最初に書いたコードを記載します。
32
+
33
+
34
+
35
+ ```PHP
36
+
37
+ // 事前処理は省略
38
+
39
+
40
+
41
+ // 更新用データベース名の格納された配列
42
+
43
+ $corp_list;
44
+
45
+ // トランザクション開始
46
+
47
+ pg_query("BEGIN");
48
+
49
+ // クエリ実行の成否
50
+
51
+ $db_ret = 0;
52
+
53
+ // 企業数
54
+
55
+ $cnt = 0;
56
+
57
+
58
+
59
+ foreach ($corp_list as $key => $val) {
60
+
61
+ echo "処理開始 => DB名:{$val} \n";
62
+
63
+
64
+
65
+ // PostgreSQLに接続
66
+
67
+ $con = pg_connect("dbname=$val その他接続情報");
68
+
69
+ if(!$con){
70
+
71
+ $db_ret = 1;
72
+
73
+ break;
74
+
75
+ }
76
+
77
+
78
+
79
+ // 更新用SQLの取得、実行
80
+
81
+ $query = 更新用SQL;
82
+
83
+ $result = pg_query($con, $query);
84
+
85
+ if(!$result){
86
+
87
+ echo "SQL実行ERROR\n";
88
+
89
+ $db_ret = 1;
90
+
91
+ break;
92
+
93
+ }
94
+
95
+
96
+
97
+ echo "処理終了 => OK\n";
98
+
99
+ // PostgreSQL接続クローズ
100
+
101
+ pg_close($con);
102
+
103
+ $cnt++;
104
+
105
+ }
106
+
107
+
108
+
109
+ // トランザクション終了 0:コミット、0以外:ロールバック
110
+
111
+ if($db_ret == 0) {
112
+
113
+ echo "COMMIT実行\n";
114
+
115
+ pg_query("COMMIT");
116
+
117
+ }else {
118
+
119
+ echo "ROLLBACK実行\n";
120
+
121
+ pg_query("ROLLBACK");
122
+
123
+ }
124
+
125
+
126
+
127
+ // DB切断
128
+
129
+ $dbl->disconnect();
130
+
131
+ echo "処理件数 => {$cnt} \n";
132
+
133
+ ```
134
+
135
+
136
+
137
+ これを実行すると、途中でエラーになってROLLBACKを実行しても変更済みのデータベースが
138
+
139
+ ロールバックされません。
140
+
141
+ ご意見・ご指摘いただけますでしょうか。