質問事項
WordPressのロールバックですが以下hogehoge()で成功しました。
私の理解によれば成功しないはずなのに、なぜ成功したのか?(つまり私の理解は何が間違いなのか?)を知りたいです。
hogehoge()
・まずfinaryが実行されますからロールバックの前にアンロックが処理されます。
・そしてアンロックしてしまってはロールバックは効かないはずです。
こう理解をしているので、以下hogehoge()でなぜ成功したのか疑問です。
php
1function hogehoge() { 2 global $wpdb; 3 4 // トランザクションを開始 5 $wpdb->query("START TRANSACTION"); // BEGINでもOK 6 7 // 処理対象のテーブルをロック(table_name1, table_name2は適宜変更) 8 $wpdb->query("LOCK TABLES table_name1 WRITE, table_name2 WRITE"); 9 10 try{ 11 // 更新処理 12 $result = update_hogehoge(); 13 14 // エラー起こしてないか確認 15 if( is_wp_error( $result ) ){ 16 $wpdb->query('ROLLBACK'); // Rollback 17 // 必要があればエラー処理 18 return; 19 } 20 21 $wpdb->query('COMMIT'); // Commit 22 23 }catch( Exception $e ){ 24 $wpdb->query('ROLLBACK'); // Rollback 25 // エラー処理をもごもご 26 27 }finally{ 28 // テーブルのロックを解除 29 $wpdb->query('UNLOCK TABLES'); 30 } 31}
確認事項1
まずfinaryが実行される
という理解は、このページによるものです。
https://qiita.com/eijenson/items/7e9e112e69b37f72353c
この理解は間違っているでしょうか?
###確認事項2
アンロックしてしまってはロールバックは効かないはず
という理解は、以下コードが「//失敗」と「//成功」になったからです。
確認事項1が正しければ、hogehoge()ではfinaryにあるアンロックがまず処理されます。
それは以下「//失敗」の順序と同じはずです。しかしこれは失敗してしまいました。
逆にアンロックを後に処理した「//成功」が成功したので、こう理解しています。
この理解は間違っているでしょうか?
php
1//失敗 2global $wpdb; 3if( $flag_rollback ){ 4 $wpdb->query('UNLOCK TABLES'); 5 $wpdb->query('ROLLBACK'); 6}else{ 7 $wpdb->query('COMMIT'); 8 $wpdb->query('UNLOCK TABLES'); 9} 10 11//成功 12global $wpdb; 13if( $flag_rollback ){ 14 $wpdb->query('ROLLBACK'); 15}else{ 16 $wpdb->query('COMMIT'); 17} 18$wpdb->query('UNLOCK TABLES'); 19
ツールのバージョン
バージョンが関係あるかわかりませんが、WordPressは5.4で、PHPは7.3.0になります。
回答4件
あなたの回答
tips
プレビュー