鉴于两项交易:
T1
set transaction isolation level repeatable read;
begin transaction
select * from tmp where val=1;
update tmp set txt='rerwer11' where val=1;
waitfor delay '00:00:7';
commit;
T2
set transaction isolation level repeatable read;
begin transaction
select * from tmp where val=2;
update tmp set txt='rerwer11' where val=2;
commit;
启动 T1 并在执行启动时 T2 。我认为第一个事务只锁定val=1
的行,因此不必阻塞第二个事务,因为处理其他行。但事实证明,第二次交易等待首先完成。
如果我对它们使用默认隔离级别(读取已提交)并使用update
提示运行xlock
,则一切都像我预期的那样:只有在尝试读取{{1 }}
答案 0 :(得分:0)
首先,隔离级别永远不会影响DDL,DML语句。它们仅用于选择..其次,更新永远不会阻止整个表,除非考虑一些因素,如没有索引(所以表扫描),锁定升级.. < / p>
由于可重复读取隔离级别导致选择共享锁保持不变直到事务提交,您的示例中出现阻塞
来你的榜样
1.Select永远不会阻止表,但是在交易完成之前不允许表上存在冲突的锁
2.如果您的更新获得了超过5000个锁,那么它将阻止整个表(甚至不选择)