2017-10-18 3 views
0

MySQL(InnoDB)内の特定の行をロックして、特定の行を別の接続で読み取ることができないようにしたい。排他ロック(行レベル) - MySqlに例が必要

start transaction; 
Select apples from fruit where apples = 'golden'; 
commit; 

は今、私は排他ロックに

排他ロック 同じ行をロックし、他のトランザクションを防ぐロックの種類を適用します。

https://dev.mysql.com/doc/refman/5.5/en/innodb-locking.html#innodb-shared-exclusive-locks

私は、ロック取得のは、その後、最初の接続まで待たなければならない同じ行にアクセスしようとする第二の接続はしてロックを解除し、適用される、と仮定している「コミット;」

私の質問は、SQL文を調整してそのロックを適用する方法です。またはこれは開始トランザクションで自動的に発生しますか?

私は良い例を見つけようとしてきました。

答えて

1
START TRANSACTION; 
Select apples 
    from fruit 
where apples = 'golden' 
    FOR UPDATE; 
... 
COMMIT; 

SELECT ... FOR UPDATEステートメントは、最初に行をロックしてから返します。

同じ行に同じ行を同時に実行しようとする人は、COMMITまたはROLLBACKを待つことになり、変更を加えたときに行が返されます。

行を変更するつもりがない場合は、ほかの誰もできないようにしたい場合は、SELECT ... LOCK IN SHARE MODEを使用できます。

どちらの方法でも、技術的には「行」ではなく、実際にはロックされているインデックスレコードですが、InnoDBでは「すべてがインデックスです」(実際にはインデックスのないテーブル依然としてシステムによって作成された1つの索引を持っているので)、結果は同じです。

関連する問題