可重复读取隔离级别是否锁定所有表以进行更新?

时间:2016-07-27 10:49:12

标签: sql sql-server tsql transactions

鉴于两项交易:

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 }}

1 个答案:

答案 0 :(得分:0)

首先,隔离级别永远不会影响DDL,DML语句。它们仅用于选择..其次,更新永远不会阻止整个表,除非考虑一些因素,如没有索引(所以表扫描),锁定升级.. < / p>

由于可重复读取隔离级别导致选择共享锁保持不变直到事务提交,您的示例中出现阻塞

来你的榜样
1.Select永远不会阻止表,但是在交易完成之前不允许表上存在冲突的锁 2.如果您的更新获得了超过5000个锁,那么它将阻止整个表(甚至不选择)