【问题标题】:Does repeatable read isolation level lock all table for update?可重复读取隔离级别是否会锁定所有表以进行更新?
【发布时间】:2016-07-27 10:49:12
【问题描述】:

给定两个交易:

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 的行,因此第二个事务不必因为处理其他行而被阻止。但事实证明,第二笔交易等待第一次完成。 如果我对它们都使用默认隔离级别(已提交读)并运行updatexlock 提示,一切都会像我预期的那样工作:第二个只有当它尝试使用val=1 读取行时才会被阻止

【问题讨论】:

    标签: sql sql-server tsql transactions


    【解决方案1】:

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

    由于可重复读取隔离级别在事务提交之前保持选择共享锁完好无损,因此您在示例中遇到阻塞

    来看看你的例子
    1.Select永远不会阻塞表,但在事务完成之前不允许表上的冲突锁
    2.如果你的更新获得了超过5000个锁,那么它将阻塞整个表(甚至不选择)

    【讨论】:

    • 我完全采用可重复读取来防止其他事务修改某些行。但是为什么它会锁定所有表?它不必只锁定已读取的行吗?
    • 可重复读取只锁定正在读取的行,只有可序列化获取范围锁直到事务结束
    • 要查看您的表被阻止的原因,请参阅 sys.dm_tran_locks
    • 看看你的更新是否超过了5000个锁,那么它会锁表
    • 我没有系统权限。这就是我的问题被问到的原因。
    猜你喜欢
    • 1970-01-01
    • 2017-04-14
    • 2019-05-02
    • 2020-04-04
    • 2021-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    相关资源
    最近更新 更多