为什么'read uncommitted'隔离级别允许锁定?

时间:2015-03-18 08:33:08

标签: tsql locking ssms isolation-level read-uncommitted

我在代码中放置了一个断点,用于在提交或回滚事务之前暂停执行。然后我想查看数据库的当前状态,但是当我在ssms中设置事务隔离级别为read uncommited并对受暂停事务影响的表运行查询时它会被锁定并等待直到事务处理结束。

为什么会发生这种情况,是否可以禁用锁定?

1 个答案:

答案 0 :(得分:1)

我的水晶球告诉我,你暂停的交易已经进行了架构修改。

此类修改取出[架构修改锁定](Sch-M)(https://technet.microsoft.com/en-us/library/ms175519%28v=sql.105%29.aspx?f=255&MSPPError=-2147217396):

  

这意味着Sch-M锁定将阻止所有外部操作,直到锁定被释放。

这包括甚至能够使用查询编译您的read uncommitted,因为:

  

数据库引擎在编译和执行查询时使用模式稳定性(Sch-S)锁定

这是有道理的 - 架构修改可以包括添加或删除列,以便其他查询无法知道磁盘/内存中当前数据布局实际意味着什么。

即使您所做的一切都是禁用约束的情况,优化器通常会在规划查询时使用约束信息 - 例如是否实际可以信任检查约束。