我们有一个在 SQL Server 2016 SP1 Enterprise 上运行并且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
阻塞UPDATE
?
如果@@trancount <> 0 则该 SELECT 将以当前事务隔离级别运行。其中(除非它已经恰好是 SNAPSHOT)将需要 S 锁来读取数据。
如果您希望所有使用默认 READ COMMITTED 隔离级别的 SELECT 都使用行版本控制而不是 S 锁,请在数据库上设置 READ COMMITTED SNAPSHOT。