为什么在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 不会获取锁定 YET 。但所有写入执行都被放入一个名为"等待元数据锁定的队列中。被阻止了。
我想要一个锁定,在没有获取时不会阻止其他查询。
我的案例是在线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;
如果有长时间的过渡,这太危险了。
答案 0 :(得分:2)
为什么会话B没有锁定表呢?你告诉它锁定桌子,对吗?那么为什么不呢?获得锁定的全部本质是防止其他会话同时写入。如果你不想那样,就不要锁定。