web-dev-qa-db-ja.com

Selectステートメントをトランザクションに入れる

これら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の直後に別のセッションから呼び出されましたが、いつ処理されますか?

10
Songo

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

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

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がこれらのステートメントを実行する順序に応じて、削除行が表示されます(または表示されません)。

警告

MySQL 5.6には以下が含まれます

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

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

5
RolandoMySQLDBA