お世話になります。
現在、複数のデータベース定義を一度に変更するパッチをPHPで書いています。
たとえばtest1,test2,test3というデータベース(テーブル定義は同じ)があった場合、
ひとつずつデータベースに接続してSQLを実行して変更していくのですが、
test3で障害が発生したときtest1,test2の変更をロールバックしたいです。
test1,test2,test3はあくまで例で、データベースは顧客数分あります(顧客毎にDBを分ける設計)。
当然、保存されているデータはデータベース毎に異なりますが、新機能追加にあたり、
データベース定義が変更されることになりました。
手動で変更をかけると人的ミスが起こりうるのでパッチを書くことになった、という経緯があります。
調べたところ、データベースをまたがったトランザクションの例はなかなか
出てこないのですがPHPで実装可能でしょうか?
最初に書いたコードを記載します。
PHP
1 // 事前処理は省略 2 3 // 更新用データベース名の格納された配列 4 $corp_list; 5 // トランザクション開始 6 pg_query("BEGIN"); 7 // クエリ実行の成否 8 $db_ret = 0; 9 // 企業数 10 $cnt = 0; 11 12 foreach ($corp_list as $key => $val) { 13 echo "処理開始 => DB名:{$val} \n"; 14 15 // PostgreSQLに接続 16 $con = pg_connect("dbname=$val その他接続情報"); 17 if(!$con){ 18 $db_ret = 1; 19 break; 20 } 21 22 // 更新用SQLの取得、実行 23 $query = 更新用SQL; 24 $result = pg_query($con, $query); 25 if(!$result){ 26 echo "SQL実行ERROR\n"; 27 $db_ret = 1; 28 break; 29 } 30 31 echo "処理終了 => OK\n"; 32 // PostgreSQL接続クローズ 33 pg_close($con); 34 $cnt++; 35 } 36 37 // トランザクション終了 0:コミット、0以外:ロールバック 38 if($db_ret == 0) { 39 echo "COMMIT実行\n"; 40 pg_query("COMMIT"); 41 }else { 42 echo "ROLLBACK実行\n"; 43 pg_query("ROLLBACK"); 44 } 45 46 // DB切断 47 $dbl->disconnect(); 48 echo "処理件数 => {$cnt} \n";
これを実行すると、途中でエラーになってROLLBACKを実行しても変更済みのデータベースが
ロールバックされません。
ご意見・ご指摘いただけますでしょうか。
回答4件
あなたの回答
tips
プレビュー