我尝试复现问题[1]的情况。
在表格上,我使用维基百科“隔离(数据库系统)”[2]中的数据填充了数据,并在SQL Server 2008 R2 SSMS中执行了以下操作:
1)首先在SSMS的第一个选项卡(窗口)中。
更新:
抱歉,结果已经更正。
根据2)中设置的隔离级别,我的结果是SELECT返回:
- 立即返回(读取未提交的插入行)
- 对于所有使用NOLOCK的SELECT情况
- 对于使用READ UNCOMMITTED的SELECT(无论是否使用NOLOCK)
- 在READ COMMITTED及更高的事务隔离级别(REPEATABLE READ、SERIALIZABLE)下等待事务1)完成(仅当SELECT没有使用NOLOCK时)
这些结果与问题描述(以及答案中解释的内容)[1]相矛盾
例如,SELECT with NOCHECK正在等待1)的完成等等。
如何解释我的结果和[1]呢?
更新2:
这个问题实际上是我问题[3]的子问题(或者说是它们没有得到回答的结果)。
引用:
[1]
解释SQL Server中的锁定行为
Explain locking behavior in SQL Server
[2]
“隔离(数据库系统)”
请在链接后面添加)。我无法在此处保留它! http://en.wikipedia.org/wiki/Isolation_(database_systems)
[3]
SELECT语句在SQL Server 2005中是否默认使用NOLOCK?
Is NOLOCK the default for SELECT statements in SQL Server 2005?
在表格上,我使用维基百科“隔离(数据库系统)”[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的SELECT(无论是否使用NOLOCK)
- 在READ COMMITTED及更高的事务隔离级别(REPEATABLE READ、SERIALIZABLE)下等待事务1)完成(仅当SELECT没有使用NOLOCK时)
这些结果与问题描述(以及答案中解释的内容)[1]相矛盾
例如,SELECT with NOCHECK正在等待1)的完成等等。
如何解释我的结果和[1]呢?
更新2:
这个问题实际上是我问题[3]的子问题(或者说是它们没有得到回答的结果)。
引用:
[1]
解释SQL Server中的锁定行为
Explain locking behavior in SQL Server
[2]
“隔离(数据库系统)”
请在链接后面添加)。我无法在此处保留它! http://en.wikipedia.org/wiki/Isolation_(database_systems)
[3]
SELECT语句在SQL Server 2005中是否默认使用NOLOCK?
Is NOLOCK the default for SELECT statements in SQL Server 2005?