VillageSQL is a drop-in replacement for MySQL with extensions.
All examples on this page work on VillageSQL. Install Now →
sakila_practice データベースを
使います。始める前にそこにあるセットアップのブロックをもう一度実行し、次に
mysql -u root -p sakila_practice でクライアントを開いてください。
トランザクションの仕組み
FIRST_STATEMENT と SECOND_STATEMENT を、一緒に成功しなければならない文に
置き換えます。
COMMIT は作業を永続化し、他の全員から見えるようにします。ROLLBACK は作業を
捨て、行を元のとおりに戻します。この 2 つのどちらかを入力するまで、変更は
あなただけのものです。別のセッションにはまだ古い値が見えています。
トランザクションの外にあるすべての文は、それ自体でコミットします。autocommit
がオンだからです。
COMMIT が必要なかったのはそのためです。各 INSERT と
UPDATE は 1 文のトランザクションでした。START TRANSACTION は、あなたが
終えるまでそれを保留します。
例
- ROLLBACK で作業を取り消す
SELECT は 400 と 350 を報告します。セッションは自分の
コミットされていない作業を見るためです。その後の ROLLBACK が両方の更新を
取り消します。
- COMMIT で作業を保持する
頼まれなくてもコミットする文がある
データベースの形を変える文はロールバックできません。さらに悪いことに、そうした 文を実行すると、開いているトランザクションがその時点までに行ったことがコミット されます。ROLLBACK を含め、すべての行が成功を報告します。
CREATE TABLE は自身の実行前に更新をコミットしたため、
ROLLBACK には取り消すものが残っておらず、それでも成功を報告しました。
ALTER TABLE、DROP TABLE、TRUNCATE TABLE、および RENAME TABLE も同じ
ように振る舞います。データを守っているトランザクションからは、この 5 つを
すべて外してください。
一時テーブルは例外です。CREATE TEMPORARY TABLE と DROP TEMPORARY TABLE は
何もコミットしないため、途中に一時テーブルを置いた同じテストでは、残高は
500.00 のままです。
まとめ
START TRANSACTION、次に文、次にCOMMITまたはROLLBACKと書きます。- トランザクションの外にあるすべての文は、それ自体でコミットすると考えてください。
autocommitがオンだからです。 - 自分のセッションは自身のコミットされていない変更を見るが、他のセッションはそれを見ないと考えてください。
ROLLBACKを唯一の取り消しとして扱います。CREATE TABLE、ALTER TABLE、DROP TABLE、TRUNCATE TABLE、およびRENAME TABLEはトランザクションから外します。それぞれがトランザクションをコミットするためです。CREATEとDROPのTEMPORARY形は何もコミットしないと考えてください。
関連項目
- UPDATE — トランザクションで包む価値が最も高い文
- DELETE — 取り戻したくなるかもしれない行の削除
- MySQL のトランザクション — 分離レベル、ロック、およびそのコスト
- MySQL のデッドロック — 2 つのトランザクションが同じ行を求めたときに起きること