sql >> データベース >  >> RDS >> Mysql

phpmysqliの自動コミットとロールバックの適切な使用法

    データベースの一貫性を維持するために一緒に実行する必要がある一連のSQLステートメントがある場合に使用します。 commitを呼び出すことは、ゲームのセーブポイントを確立することと考えてください。ロールバックを呼び出すときはいつでも、前のコミットまでに行われたすべてを元に戻します。

    請求書を請求書テーブルに、詳細をinvoice_detailsテーブルに、支払いを支払いテーブルに保存する必要がある状況を想像してみてください。一貫性を維持するには、これらがすべて実行されているか、実行されていないことを確認する必要があります。請求書と詳細を追加する場所で、支払いの挿入に失敗した場合、データベースは一貫性のない状態のままになります。

    通常、これは次のようなtry/catchブロックを使用して実行されます。

    try {
        $dbconnect->autocommit(false);
    
        $stmt = $dbconnect->prepare("INSERT INTO `invoices`(`col1`,`col2`) VALUES (?,?)");
        $stmt->bind_param('ss',$val1,$val2);
        $stmt->execute();
    
        $stmt = $dbconnect->prepare("INSERT INTO `invoice_details`(`col1`,`col2`) VALUES (?,?)");
        $stmt->bind_param('ss',$val3,$val4);
        $stmt->execute();
    
        $stmt = $dbconnect->prepare("INSERT INTO `payments`(`col1`,`col2`) VALUES (?,?)");
        $stmt->bind_param('ss',$val5,$val6);
        $stmt->execute();
    
        $dbconnect->commit();
    } catch(Exception $e){
        // undo everything that was done in the try block in the case of a failure.
        $dbconnect->rollback();
    
        // throw another exception to inform the caller that the insert group failed.
        throw new StorageException("I couldn't save the invoice");
    }
    



    1. RailsでMySQLstrictモードをオフにする方法

    2. データソースが接続の確立を拒否しました、サーバーからのメッセージ:接続が多すぎます

    3. MySQLの強制終了プロセスはユーザーが十分なポイントを取得していないPHP

    4. SpringデータJPAは1つの複合キーのみが自動インクリメントの問題です