我想知道是否:
- 隔离级别为已提交读
- 数据被插入、删除或读取
与传统的行存储表一样,用于全局临时表的锁是相同的锁(读取共享,插入/删除独占)。
对于临时表,我相信它在当前上下文中“存在”时不会发生阻塞,因此我无法同时读取和插入数据。
但是对于全局临时表,假设我有很多操作——一些正在插入新数据,一些正在删除数据,还有一些要读取的数据将被删除。
假设表的结构是:
GroupID EntityID
1 101
1 102
1 103
2 101
2 104
3 100
这里是否适用相同的规则?
我对这个问题很好奇,想试试看 tempdb 是否是一个特殊的数据库,或者就像另一个用户数据库一样,其中应用了默认隔离“已提交读”。
以下是我执行的查询:
在下一个窗口中对这些表的几条记录执行更新查询
上述两个语句都按预期更新了 22 行。
后来我在两个不同的窗口中对这两个表运行了 select 语句,到目前为止都被卡住了:
我注意到在第一个查询中根本没有记录出现在屏幕上,而在第二种情况下,8830 条记录在屏幕上并随后卡住(不知道为什么?)但是在这两种情况下,查询都被卡住并永远运行他们正在等待更新完成。这是 MSSQL 数据库的默认行为所期望的。
我使用 sp_whoisactive 进行了验证,并且可以看到存在如下数据库阻塞:
详细信息提供了它们中的每一个的锁定信息。
第一个:
第二:
第三:
还使用以下命令交叉检查每个事务的隔离级别:
结果:
有了所有这些,可以说对于 tempdb,隔离级别也设置为“已提交读”,并且规则适用于其他数据库。
我已经在 MSSQL 2019 版本上运行了这些查询。