【发布时间】:2023-04-11 04:23:01
【问题描述】:
我试图重现问题[1]的情况。
在桌子上,从 wiki 的“隔离(数据库系统)”[2] 中获取并填充数据,
在 SQL Server 2008 R2 SSMS 中,我执行了:
1) SSMS 的第一个选项卡(窗口)中的第一个
-- transaction isolation level in first window does not influence results (?)
-- initially I thought that second transaction in 2) runs at the level set in first window
begin transaction
INSERT INTO users VALUES ( 3, 'Bob', 27 )
waitfor delay '00:00:22'
rollback
2) 紧接着,在第二个窗口中
-- this is what I commented/uncommented
-- set transaction isolation level SERIALIZABLE
-- set transaction isolation level READ REPEATABLE
-- set transaction isolation level READ COMMITTED
-- set transaction isolation level READ UNCOMMITTED
SELECT * FROM users --WITH(NOLOCK)
更新:
抱歉,结果已更正。
根据 2) 中设置的隔离级别,我的结果是 SELECT 返回:
-
立即(读取未提交的插入行)
- 对于所有带有 NOLOCK 的 SELECT 情况
- 用于 READ UNCOMMITTED(选择带或不带 NOLOCK)
-
正在等待事务 1) 的完成(仅当 SELECT 没有 NOLOCK)和
- 在 READ COMMITTED 及更高(REPEATABLE READ,SERIALIZABLE)事务隔离级别
这些结果与问题中描述的情况相矛盾(并在答案中解释过?)[1]
(例如,带有 NOCHECK 的 SELECT 正在等待 1) 的完成)等。
如何解释我的结果和 [1]?
更新2:
这个问题实际上是我的问题 [3] 的子问题(或未回答的结果)。
引用:
[1]
解释 SQL Server 中的锁定行为
Explain locking behavior in SQL Server
[2]
“隔离(数据库系统)”
请添加尾随)链接。我无法设法将它保存在链接中!
http://en.wikipedia.org/wiki/Isolation_(database_systems)
[3]
NOLOCK 是 SQL Server 2005 中 SELECT 语句的默认值吗?
Is NOLOCK the default for SELECT statements in SQL Server 2005?
【问题讨论】:
-
插入事务的隔离级别根本不会影响第二个事务看到的内容。您确定您的第二笔交易没有在
READ UNCOMMITTED级别下运行吗?
标签: sql-server tsql transactions locking isolation-level