我们有一个运行在Server 2016 SP1企业上的数据库,并在其上启用了Allow Snapshot Isolation。在这种情况下,读取器不阻塞作者,编写器不阻止读取器。
今天,我们看到一个SELECT-query阻塞了一个UPDATE-query。以下是所讨论的问题:
第一个查询:
IF @@TRANCOUNT = 0 SET TRANSACTION ISOLATION LEVEL SNAPSHOT
SELECT TOP 10 Field1, Field2, Field3 FROM [dbo].[TABLE1]
WHERE ([Field1] = @SV1 AND (1=1))
ORDER BY A.[Field1] ASC,A.[Field2] ASC
OPTION (KEEP PLAN, KEEPFIXED PLAN, LOOP JOIN)第二个查询:
UPDATE [dbo].[Table1] SET [Field4]= @V128, [Field5]= @V140, [Field6]= @V141 WHERE [Field3] = @ID0如果理解版本控制正确,则SELECT-query不使用任何锁,因为它对数据的快照起作用(在事务开始时获取)。SELECT-query如何阻止UPDATE?
发布于 2018-05-02 19:38:38
如果@@trancount <> 0,则该选择将以当前事务隔离级别运行。这(除非已经是快照)需要S锁才能读取数据。
如果希望所有选择使用默认的READ提交隔离级别来使用行版本控制而不是S锁,请在数据库上设置READ提交快照。
https://dba.stackexchange.com/questions/205608
复制相似问题