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

MySQLのコミットとトランザクション

    InnoDBでは、自動コミットのデフォルト設定である「オン」を変更していない場合、単一クエリのトランザクションを明示的に開始または終了する必要はありません。自動コミットがオンの場合、InnoDBはトランザクション内のすべてのSQLクエリを自動的に囲みます。これはSTART TRANSACTION; query; COMMIT;

    START TRANSACTIONを明示的に使用する場合 自動コミットがオンになっているInnoDBで、START TRANSACTIONの後に実行されたクエリ ステートメントはすべて実行されるか、すべて失敗します。これは、銀行環境で役立ちます。たとえば、500ドルを銀行口座に送金する場合、その合計が銀行の残高から差し引かれ、銀行の残高に加算された場合にのみ、その操作は成功するはずです。したがって、この場合、次のようなものを実行します

    START TRANSACTION;
    UPDATE customers SET balance = balance - 500 WHERE customer = 'Daan';
    UPDATE customers SET balance = balance + 500 WHERE customer = 'Dennis';
    COMMIT;
    

    これにより、両方のクエリが正常に実行されるか、まったく実行されませんが、1つだけではありません。この投稿 トランザクションをいつ使用する必要があるかについて、もう少し説明します。

    InnoDBでは、テーブル全体をロックする必要はほとんどありません。 InnoDBは、MyISAMとは異なり、行レベルのロックをサポートしています。これは、クライアントがテーブル全体をロックする必要がなく、他のクライアントに待機を強いることを意味します。クライアントは、実際に必要な行のみをロックして、他のクライアントが必要な行に引き続きアクセスできるようにする必要があります。

    InnoDBトランザクションの詳細については、こちら> 。デッドロックに関する質問は、セクション14.2.8.8で回答されます。 および 14.2.8.9 ドキュメントの。クエリが失敗した場合、MySQLドライバーは理由を示すエラーメッセージを返します。その後、アプリは必要に応じてクエリを再発行する必要があります。

    最後に、サンプルコードでは、mysql_queryを使用しました 。新しいコードを作成する場合は、古くて低速で非推奨のmysql_の使用を中止してください。 PHP用のライブラリで、mysqli_を使用します または代わりにPDO:)




    1. SQLServerのパフォーマンスTOPIOクエリ-2

    2. SQL:優先度で並べ替えますが、最後に0を付けます

    3. Excelのダウンロードが188kbスタックしました

    4. 純粋なmysqlでこれを解決できますか? (列の''で区切られた値に参加します)