0

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

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

4

1 回答 1

1

我的水晶球告诉我,您暂停的事务已对架构进行了修改。

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

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

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

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

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

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

于 2015-03-18T15:17:25.610 回答