これら2つのクエリの違いは何ですか。
START TRANSACTION;
SELECT * FROM orders WHERE id=1;
UPDATE orders SET username='John' WHERE id=1;
COMMIT;
そしてトランザクションなし:
SELECT * FROM orders WHERE id=1;
UPDATE orders SET username='John' WHERE id=1;
トランザクション内にSELECT
があるとどのような影響がありますか?
DELETE FROM orders WHERE id=1
はどちらの場合もSELECT
の直後に別のセッションから呼び出されましたが、いつ処理されますか?
トランザクション内のSELECTクエリ自体は、UPDATEおよびDELETEから適切に保護されていません。
以下を使用するために必要なもの:
start transaction;
(最初のクエリにあるもの)set autocommit = 0;
Delete From orders Where id=1
を発行する場合、トランザクションの終了時にorders
テーブルの行がロックを解放すると発生します。 (Dev/Staging Server上で)READ UNCOMMITTED
トランザクション分離レベルを使用して実験的に削除を論理的に実行することができますが、コミット時にのみ、永続的に表示および記録されます。
2番目のトランザクションでは、基本的にすべてのベットがオフになっています。走れば
select * From orders Where id=1;
UPDATE orders SET username="John" Where id=1;
Delete From orders Where id=1
を実行すると、すぐにコミットされます。 MySQLがこれらのステートメントを実行する順序に応じて、削除行が表示されます(または表示されません)。
START TRANSACTION READ WRITE;
START TRANSACTION READ ONLY;
READ WRITEおよびREAD ONLY修飾子は、トランザクションアクセスモードを設定します。トランザクションで使用されるテーブルへの変更を許可または禁止します。 READ ONLY制限は、トランザクションが他のトランザクションから見えるトランザクションテーブルと非トランザクションテーブルの両方を変更またはロックすることを防ぎます。トランザクションは引き続き一時テーブルを変更またはロックできます。これらの修飾子は、MySQL 5.6.5以降で使用できます。