sql - 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_TRANSACTIONS
。ON
下面的快照展示了发生了什么:
你看到问题了吗?选择查询仍在执行!此查询永远不会返回。它仅在我提交或回滚插入语句后返回。我多次测试相同的场景,同样的事情一遍又一遍地发生。
为了进一步证实我的观察,请查看以下报告:
你能帮忙,让我知道我做错了什么吗?
或者如果我认为不能阻止读者的假设是完全(或部分)错误的?
谢谢!
注意:最初,当我想查询表时,我以与插入会话相同的用户身份连接。一旦我看到我的选择被阻止,我决定使用另一个用户登录并进行测试。因此,使用“sa”帐户。:)
解决方案
READ_COMMITTED_SNAPSHOT
如果您打开数据库选项,读取器不会阻止 SQL Server 中的写入器(反之亦然) 。SQL Server 然后将使用行版本控制而不是锁定来为READ_COMMITTED
事务提供读取一致性,其行为类似于您更熟悉的 Oracle DBMS。
READ_COMMITTED_SNAPSHOT
在 Azure SQL 数据库中默认启用,但在本地 SQL Server 版本中未启用,以实现向后兼容性。
推荐阅读
- postgresql - postgresql - 为什么 now() 保存后不正确?
- testing - Dialogflow Chatbot 负载/性能测试
- node.js - 如何获取我的应用程序所在的当前时区
- python - Firebase Admin 用户身份验证不发送短信,只直接创建用户
- javascript - 在路由返回响应后可以在 koa 中进行异步调用的推荐方法是什么?
- spring-boot - Spring JPA:如何为下表和查询规范编写实体类
- r - 在 R Shiny 中,如何将使用 rhandsontable 生成的表和相关输入移动到模态对话框中?
- python-3.x - Python Beautifulsoup 在 spans 中抓取了错误的数据
- javascript - 如何确定数组是否包含某个字符串?
- python - 如何将一维列表中的元素替换为零比较另一个列表?