首页 > 解决方案 > SQL - 为什么 SELECT 查询已被 INSERT 阻塞?

问题描述

我一直认为作家永远不会阻止读者(反之亦然)。

然而,现在所看到的却很奇怪。我可能错了,在这里遗漏了一些东西。所以请帮忙,因为这让我发疯!

今天我创建了一个非常简单的表格:

USE [testdb]
GO

CREATE TABLE [dbo].[MyTab](
    [N] [int] NULL
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[MyTab]  WITH CHECK ADD CHECK  (([n]>(10)))
GO

然后我用几行填充它。

接下来,我决定在完全独立的 SQL Server Management Studio 执行中设置并从另一个会话中的表中进行选择IMPLICIT_TRANSACTIONSON下面的快照展示了发生了什么:

在此处输入图像描述

你看到问题了吗?选择查询仍在执行!此查询永远不会返回。它仅在我提交或回滚插入语句后返回。我多次测试相同的场景,同样的事情一遍又一遍地发生。

为了进一步证实我的观察,请查看以下报告:

在此处输入图像描述

你能帮忙,让我知道我做错了什么吗?

或者如果我认为不能阻止读者的假设是完全(​​或部分)错误的?

谢谢!

注意:最初,当我想查询表时,我以与插入会话相同的用户身份连接。一旦我看到我的选择被阻止,我决定使用另一个用户登录并进行测试。因此,使用“sa”帐户。:)

标签: sqlsql-servertransactions

解决方案


READ_COMMITTED_SNAPSHOT如果您打开数据库选项,读取器不会阻止 SQL Server 中的写入器(反之亦然) 。SQL Server 然后将使用行版本控制而不是锁定来为READ_COMMITTED事务提供读取一致性,其行为类似于您更熟悉的 Oracle DBMS。

READ_COMMITTED_SNAPSHOT在 Azure SQL 数据库中默认启用,但在本地 SQL Server 版本中未启用,以实现向后兼容性。


推荐阅读