2

私は次のコードを持っています:

...
$mysqli->autocommit(FALSE);

if(in_array('files',$item)){
            $sql_el_truncate = "
                TRUNCATE TABLE `article_files`;
                TRUNCATE TABLE `files`;
                TRUNCATE TABLE `gallery_files`;
                TRUNCATE TABLE `image_captions`;
            ";

            $mysqli->multi_query($sql_el_truncate);

            do{ 
                $mysqli->use_result(); 
            }while ($mysqli->next_result()); 


            if ($mysqli->errno) { 
                $valid_entry = 0;
            } 
            echo $valid_entry;
        }

if( $valid_entry){
            $mysqli->commit();
        }else{
            $mysqli->rollback();
        }

...

エラー時に適切な$valid_entry値0を取得しますが、ロールバックが機能していません。一部のTRUNCATEコマンドを意図的に誤って記述した場合でも、残りのコマンドは実行されます。エラーが発生しますが、ロールバックされません。

誰でも私がトランザクションを適切に使用する方法を知っていmysqliますか?

4

2 に答える 2

3

(強調は私のものです)のMySQLリファレンスマニュアルから:TRUNCATE TABLE

論理的には、TRUNCATE TABLEは、すべての行を削除するDELETEステートメント、または一連のDROPTABLEステートメントとCREATETABLEステートメントに似ています。高いパフォーマンスを実現するために、データを削除するDMLメソッドをバイパスします。したがって、ロールバックすることはできず、ON DELETEトリガーを起動することも、親子の外部キー関係を持つInnoDBテーブルに対して実行することもできません。

できるようにしたい場合は、代わりにステートメントROLLBACKを使用する必要があります。DELETEここでは効率が低下しますが、目的の動作が得られるはずです。

于 2012-08-31T15:22:48.837 に答える
0

これらのTRUNCATEコマンドが暗黙のコミットを引き起こすように私には見えます:

http://dev.mysql.com/doc/refman/5.0/en/implicit-commit.html

于 2012-08-31T15:27:51.940 に答える