为什么在mysql中获取写锁时会阻止所有写入执行?

时间:2013-10-08 15:13:27

标签: mysql

为什么在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;

如果有长时间的过渡,这太危险了。

1 个答案:

答案 0 :(得分:2)

为什么会话B没有锁定表呢?你告诉它锁定桌子,对吗?那么为什么不呢?获得锁定的全部本质是防止其他会话同时写入。如果你不想那样,就不要锁定。