質問編集履歴
1
説明文・コードを追加しました。
title
CHANGED
|
File without changes
|
body
CHANGED
|
@@ -5,5 +5,67 @@
|
|
|
5
5
|
ひとつずつデータベースに接続してSQLを実行して変更していくのですが、
|
|
6
6
|
test3で障害が発生したときtest1,test2の変更をロールバックしたいです。
|
|
7
7
|
|
|
8
|
+
test1,test2,test3はあくまで例で、データベースは顧客数分あります(顧客毎にDBを分ける設計)。
|
|
9
|
+
当然、保存されているデータはデータベース毎に異なりますが、新機能追加にあたり、
|
|
10
|
+
データベース定義が変更されることになりました。
|
|
11
|
+
手動で変更をかけると人的ミスが起こりうるのでパッチを書くことになった、という経緯があります。
|
|
12
|
+
|
|
8
13
|
調べたところ、データベースをまたがったトランザクションの例はなかなか
|
|
9
|
-
出てこないのですがPHPで実装可能でしょうか?
|
|
14
|
+
出てこないのですがPHPで実装可能でしょうか?
|
|
15
|
+
|
|
16
|
+
最初に書いたコードを記載します。
|
|
17
|
+
|
|
18
|
+
```PHP
|
|
19
|
+
// 事前処理は省略
|
|
20
|
+
|
|
21
|
+
// 更新用データベース名の格納された配列
|
|
22
|
+
$corp_list;
|
|
23
|
+
// トランザクション開始
|
|
24
|
+
pg_query("BEGIN");
|
|
25
|
+
// クエリ実行の成否
|
|
26
|
+
$db_ret = 0;
|
|
27
|
+
// 企業数
|
|
28
|
+
$cnt = 0;
|
|
29
|
+
|
|
30
|
+
foreach ($corp_list as $key => $val) {
|
|
31
|
+
echo "処理開始 => DB名:{$val} \n";
|
|
32
|
+
|
|
33
|
+
// PostgreSQLに接続
|
|
34
|
+
$con = pg_connect("dbname=$val その他接続情報");
|
|
35
|
+
if(!$con){
|
|
36
|
+
$db_ret = 1;
|
|
37
|
+
break;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// 更新用SQLの取得、実行
|
|
41
|
+
$query = 更新用SQL;
|
|
42
|
+
$result = pg_query($con, $query);
|
|
43
|
+
if(!$result){
|
|
44
|
+
echo "SQL実行ERROR\n";
|
|
45
|
+
$db_ret = 1;
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
echo "処理終了 => OK\n";
|
|
50
|
+
// PostgreSQL接続クローズ
|
|
51
|
+
pg_close($con);
|
|
52
|
+
$cnt++;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// トランザクション終了 0:コミット、0以外:ロールバック
|
|
56
|
+
if($db_ret == 0) {
|
|
57
|
+
echo "COMMIT実行\n";
|
|
58
|
+
pg_query("COMMIT");
|
|
59
|
+
}else {
|
|
60
|
+
echo "ROLLBACK実行\n";
|
|
61
|
+
pg_query("ROLLBACK");
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// DB切断
|
|
65
|
+
$dbl->disconnect();
|
|
66
|
+
echo "処理件数 => {$cnt} \n";
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
これを実行すると、途中でエラーになってROLLBACKを実行しても変更済みのデータベースが
|
|
70
|
+
ロールバックされません。
|
|
71
|
+
ご意見・ご指摘いただけますでしょうか。
|