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で回答されます。
および
最後に、サンプルコードでは、mysql_query
を使用しました 。新しいコードを作成する場合は、古くて低速で非推奨のmysql_
の使用を中止してください。 PHP用のライブラリで、mysqli_
を使用します または代わりにPDO:)