0

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

翻译太长太危险了。

4

1 回答 1

2

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

于 2013-10-08T18:03:04.177 回答