mysql で書き込みロックを取得すると、すべての書き込み実行がブロックされるのはなぜですか?
セッションが書き込みロックを取得している (ロックを取得していない) 場合、すべての書き込み実行がブロックされます。これは非論理的だと思います。
セッションがロックを取得しないということは、ロックが機能しないことを意味します。
ロックを取得する前にブロックを解除したい場合、どうすればよいですか?
例えば:
セッション A:
begin;
select * from test;
セッション B:
lock table test write; # the session is blocked.
セッション C:
insert into test values (xxx); # the session is blocked.
セッション b とセッション c はどちらも「メタデータ ロックの待機」です。
セッション b はまだロックを取得していないため、セッション c は正常に挿入できると思います。ただし、すべての書き込み実行は「メタデータ ロックの待機」という名前のキューに入れられ、ブロックされます。
まだ取得されていないときに他のクエリをブロックしないロックが必要です。
私の場合はオンラインddlです:
スクリプト:
lock table test write; # will block all queries if long transations exists;
remember some markers;
unlock tables;
create tmp_table;
add some triggers; # will block all the queries if long transations exists;
copy data;
rename table names; will block all the queries if long transations exists;
長時間の移動は危険です。