为什么在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 都是“等待元数据锁定”。
我认为会话 c 可以插入成功,因为会话 b尚未获得锁。但是所有的写执行都被放入一个名为“等待元数据锁”的队列中并被阻塞。
我想要一个在尚未获取时不会阻止其他查询的锁。
我的案例是在线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;
翻译太长太危险了。