トランザクションにSelectステートメントを置く


10

これら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両方のケースでは、ときそれが処理されるのですか?

回答:


5

トランザクション内のSELECTクエリ自体は、UPDATEおよびDELETEから適切に保護されていません。

以下を使用するために必要なもの:

を発行する場合、トランザクションの終了時にテーブルDelete From orders Where id=1内の行ordersがロックを解放すると発生します。READ UNCOMMITTEDトランザクション分離レベルを使用して論理的に削除を実行して(Dev / Staging Server上で)実験することができますが、コミット時にのみ、永続的に表示および記録されます。

2番目のトランザクションでは、基本的にすべてのベットがオフになっています。走れば

select * From orders Where id=1;
UPDATE orders SET username="John" Where id=1;

実行Delete From orders Where id=1するとすぐにコミットされます。MySQLがこれらのステートメントを実行する順序に応じて、削除行が表示されます(または表示されません)。

警告

MySQL 5.6には次のものが含まれます

  • START TRANSACTION READ WRITE;
  • START TRANSACTION READ ONLY;

READ WRITEおよびREAD ONLY修飾子は、トランザクションアクセスモードを設定します。トランザクションで使用されるテーブルへの変更を許可または禁止します。READ ONLY制限は、トランザクションが他のトランザクションから見えるトランザクションテーブルと非トランザクションテーブルの両方を変更またはロックすることを防ぎます。トランザクションは引き続き一時テーブルを変更またはロックできます。これらの修飾子はMySQL 5.6.5以降で使用できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.