質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

1633閲覧

mysqlに対するcommit後の更新がうまくできない

hatsuzo

総合スコア56

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/04/01 01:01

編集2019/04/01 01:03

お世話になっております。
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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ockeghem

2019/04/01 01:13

せっかくエラーログを詳細にとっているのですから、その生の情報を質問に追記すると回答がしやすくなると思います。err_log.txt の内容のことです。
hatsuzo

2019/04/01 02:21

ockeghemさん コメントありがとうございました。 無事解決しました。以降投稿するときはそうしたいと思います。
guest

回答1

0

ベストアンサー

とりあえず

あと、mysqliでもprepareで処理してください

最後のupdateはautocommitがオフになっている状態で発行しているから無効なのでは?

投稿2019/04/01 01:16

yambejp

総合スコア114829

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hatsuzo

2019/04/01 02:20

yamabejpさん コメントありがとうございました。 >最後のupdateはautocommitがオフになっている状態で発行しているから無効なのでは? ご指摘の通りでした。 トランザクション処理の場合は、 autocommit=0 でcommitした後は無効になると勝手に思い込んでいました。 autocommit=1 としたら問題なく動作しました。 あと、prepareについては、確かに見直さないといけないですね。 随分前に作ったまま放置してあったので、そんな機能があることすら知りませんでした。 ご指摘ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問