質問するログイン新規登録

質問編集履歴

1

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

2015/10/21 06:23

投稿

just
just

スコア90

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
+ ご意見・ご指摘いただけますでしょうか。