我试图重现问题[1]的情况。了解SQL Server中的锁定行为
在表中,取出并从维基的填充数据 “隔离(数据库系统)”[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所有病例
- (未选择NOLOCK)
等待事务1的完成)(ONLY IF SELECT是不NOLOCK)和
- 在READ COMMITTED和更高的(可重复READ,SERIALIZABLE)事务隔离级别
这些结果与问题描述的情况相矛盾(并且在答案中解释?)[1]
(例如,SELECT with NOCHECK is waiting completion of 1))等等。
我的结果和[1]如何解释?
UPDATE2:
这个问题确实是我的问题subquestion [3](或他们的结果没有回答)。
引:
[1]
解释在SQL Server锁定行为
Explain locking behavior in SQL Server
[2]
“隔离(数据库系统)”
PLZ加尾)进行链接。我无法在链接中保留它! 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?
插入事务的隔离级别不会影响第二个事务看到的东西。你确定你的第二笔交易没有在“未读未读”级别下运行吗? – 2010-10-08 12:38:35