为什么 'read uncommited' 隔离级别允许锁?
Why does 'read uncommited' isolation level allow locks?
我在我的代码中放置了一个断点以在提交或回滚事务之前暂停执行。然后我想查看数据库的当前状态,但是当我在 ssms 中将事务隔离级别设置为 read uncommited
和 运行 时,针对受暂停事务影响的表的查询被锁定并且等待交易完成。
为什么会发生这种情况,是否可以禁用锁定?
我的 crystal 球告诉我您暂停的交易已经修改了架构。
这样的修改去掉了[Schema Modification locks] (Sch-M
)(https://technet.microsoft.com/en-us/library/ms175519%28v=sql.105%29.aspx?f=255&MSPPError=-2147217396):
This means the Sch-M lock blocks all outside operations until the lock is released.
这甚至包括能够使用查询编译您的read uncommitted
,因为:
The Database Engine uses schema stability (Sch-S) locks when compiling and executing queries
这有些道理 - 架构修改 可能 包括添加或删除列,因此其他查询无法知道 disk/in 内存中数据的当前布局实际意味着什么.
即使对于您所做的只是禁用约束的情况,优化器通常也会在计划查询时使用约束信息 - 例如检查约束是否真的可以信任。
我在我的代码中放置了一个断点以在提交或回滚事务之前暂停执行。然后我想查看数据库的当前状态,但是当我在 ssms 中将事务隔离级别设置为 read uncommited
和 运行 时,针对受暂停事务影响的表的查询被锁定并且等待交易完成。
为什么会发生这种情况,是否可以禁用锁定?
我的 crystal 球告诉我您暂停的交易已经修改了架构。
这样的修改去掉了[Schema Modification locks] (Sch-M
)(https://technet.microsoft.com/en-us/library/ms175519%28v=sql.105%29.aspx?f=255&MSPPError=-2147217396):
This means the Sch-M lock blocks all outside operations until the lock is released.
这甚至包括能够使用查询编译您的read uncommitted
,因为:
The Database Engine uses schema stability (Sch-S) locks when compiling and executing queries
这有些道理 - 架构修改 可能 包括添加或删除列,因此其他查询无法知道 disk/in 内存中数据的当前布局实际意味着什么.
即使对于您所做的只是禁用约束的情况,优化器通常也会在计划查询时使用约束信息 - 例如检查约束是否真的可以信任。