お世話になっております。
PHPでmysqlに対しての更新処理を行っています。
その中で、トランザクション処理でcommitを実行(1)した直後に、別テーブルに対してのupdate(2)を実行しています。
トランザクション処理でcommitしたテーブル(1)は、SQLで参照しても更新が確認できるのですが、
その後の個別でupdateしたテーブル(2)が更新されず悩んでいます。
ログを採取しても、別テーブルに対するupdate(2)のエラーは発生しておらず、同時にダンプしたSQL文をコマンドラインで実行すると、
正常に更新されるので、SQLの文法ミスでないと思います。
このupdateを行っているSQLもトランザクション処理の中に入れてしまえば事足りるかもしれませんが、トランザクション処理の扱いに問題があるのでしょうか?
実行環境:WindowsServer2018 mysql5.5 php7.2を使用しています。
php
1while(true){ 2 // 中略 // 3 switch ($mod){ 4 case 'i': // 削除モード 5 // 中略 // 6 $sts = mysqli_query($cn, "set autocommit = 0") 7 or die ("トランザクション処理の設定に失敗しました。"); 8 $sts = mysqli_query($cn, "begin") 9 or die ("トランザクション処理の開始に失敗しました。"); 10 $SQL = "DELETE FROM nippod "; 11 $SQL.= "WHERE sycd = '{$ck_sycd}' AND npdate = '{$ck_ym}' AND gyono = {$gyo}"; 12 if (!($sts = mysqli_query($cn, $SQL))) { 13 $sts = mysqli_query($cn, "rollback"); 14 if (!$sts){ 15 print "*** ロールバック処理に失敗しました。***<br>"; 16 } 17 error_log($sqlh."\n削除に失敗しました。1",3,"err_log.txt"); 18 break; 19 } else { 20 error_log($sqlh."\n削除に成功しました。1",3,"err_log.txt"); 21 } 22 // 削除行から最終行までの行Noを配列に格納する 23 $SQL = "SELECT gyono FROM nippod "; 24 $SQL.= "WHERE sycd = '{$ck_sycd}' AND npdate = '{$ck_ym}' AND gyono > {$gyo} "; 25 $SQL.= "ORDER BY gyono"; 26 $i = 0; 27 $rs = mysqli_query($cn, $SQL); 28 if (!$rs){ 29 $sts = mysqli_query($cn, "rollback"); 30 error_log($sqlh."\n配列の格納に失敗しました。1",3,"err_log.txt"); 31 break; 32 } else { 33 error_log($sqlh."\n配列の格納に成功しました。1",3,"err_log.txt"); 34 } 35 $ary_gyo = array(); 36 // 行Noを降順に配列に格納 37 while ($row = mysqli_fetch_assoc($rs)) { 38 $ary_gyo[$i]=$row['gyono']; 39 $i++; 40 } 41 // 配列内の行Noを取り出す(降順) 42 $err = 0; 43 foreach ($ary_gyo as $gyo_n){ 44 // 行Noの大きい順から行Noを-1しながら元レコードから複写する 45 $SQL_R = "INSERT INTO nippod "; 46 $SQL_R.= "SELECT sycd, npdate, gyono-1, tkcd, tksc, vscd, tknm, tkkb, jskb, vssttime, vsedtime, "; 47 $SQL_R.= "vskb1, vskb2, vskb3, vskb4, vskb5, vskb6, vskb7, vsmemo, vscomm, chkflg, chnm "; 48 $SQL_R.= "FROM nippod "; 49 $SQL_R.= "WHERE sycd = '{$ck_sycd}' AND npdate = '{$ck_ym}' AND gyono = {$gyo_n}"; 50 if (!($rs = mysqli_query($cn, $SQL_R))) { 51 $sts = mysqli_query($cn, "rollback"); 52 error_log($sqlh."\n挿入に失敗しました。2-".$gyo_n,3,"err_log.txt"); 53 break; 54 } else { 55 error_log($sqlh."\n挿入に成功しました。2-".$gyo_n,3,"err_log.txt"); 56 } 57 // 元の行Noのレコードは削除する 58 $SQL_D = "DELETE FROM nippod "; 59 $SQL_D.= "WHERE sycd = '{$ck_sycd}' AND npdate = '{$ck_ym}' AND gyono = {$gyo_n}"; 60 if (!($rs = mysqli_query($cn, $SQL_D))) { 61 $sts = mysqli_query($cn, "rollback"); 62 error_log($sqlh."\n削除に成功しました。2-".$gyo_n,3,"err_log.txt"); 63 break; 64 } else { 65 error_log($sqlh."\n削除に成功しました。2-".$gyo_n,3,"err_log.txt"); 66 } 67 } 68 // *** 正常終了のためトランザクション終了=書込み *** 69 $sts = mysqli_query($cn, "commit"); 70 if (!$sts){ 71 error_log($sqlh."\nコミットを失敗しました。",3,"err_log.txt"); 72 } else { 73 error_log($sqlh."\nコミットを成功しました。",3,"err_log.txt"); 74 } 75 default: 76 } 77 break; 78} 79$sqld="SELECT npdate,sycd, min(vssttime) as sttm, max(vsedtime) as edtm "; 80$sqld.="FROM nippod "; 81$sqld.="WHERE npdate = {$ck_ym} AND sycd = {$ck_sycd} "; 82$sqld.="group by npdate,sycd"; 83if (!($rs = mysqli_query($cn, $sqld))) { 84 error_log($sqlh."\n時刻取得に失敗しました。",3,"err_log.txt"); 85 die; 86} 87$chk_sttm = ""; 88$chk_edtm = ""; 89// 先頭レコード 90while ($row = mysqli_fetch_assoc($rs)) { 91 $chk_sttm = $row['sttm']; 92 $chk_edtm = $row['edtm']; 93 break; 94} 95$sqlh="UPDATE nippoh SET sttime = '{$chk_sttm}', edtime = '{$chk_edtm}' "; 96$sqlh.="WHERE npdate = {$ck_ym} AND sycd = '{$ck_sycd}' "; 97print $sqlh; 98$sts = mysqli_query($cn, $sqlh); 99if (!$sts) { 100 error_log($sqlh."\n更新に失敗しました。",3,"err_log.txt"); 101} else { 102 error_log($sqlh."\n更新に成功しました。",3,"err_log.txt"); 103}
回答1件
あなたの回答
tips
プレビュー