2010-10-08 48 views
5

我试图重现问题[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?

+0

插入事务的隔离级别不会影响第二个事务看到的东西。你确定你的第二笔交易没有在“未读未读”级别下运行吗? – 2010-10-08 12:38:35

回答

2

有一个有用的MSDN]连结她讲讲锁定SQL 2008可能提示您的示例中的SQL Server 2008中disfavoring你的表锁的情况?

如下面的示例所示,如果事务隔离级别设置为SERIALIZABLE,和表级锁定(从下面有关锁潜在地由SQL Server 2008 ingored会谈链路下面的代码片断)提示NOLOCK与SELECT语句一起使用,通常用于维护可执行序列化事务的密钥范围锁不会被采用

CopyUSE AdventureWorks2008R2; 
GO 
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; 
GO 
BEGIN TRANSACTION; 
GO 
SELECT Title 
    FROM HumanResources.Employee WITH (NOLOCK); 
GO 

-- Get information about the locks held by 
-- the transaction. 
SELECT 
     resource_type, 
     resource_subtype, 
     request_mode 
    FROM sys.dm_tran_locks 
    WHERE request_session_id = @@spid; 

-- End the transaction. 
ROLLBACK; 
GO 

唯一锁采取引用HumanResources.Employee是架构稳定性(SCH-S)锁定。在这种情况下,可串行化不再保证

在SQL Server 2008中,A LTER TABLE的LOCK_ESCALATION选项可以不喜欢表锁,并在分区表上启用HoBT锁。该选项不是锁定提示,但可以用于减少锁升级。欲了解更多信息,请参阅ALTER TABLE (Transact-SQL)

+0

如果原始交易正在做'SELECT' – 2010-10-08 12:45:55

+0

@Martin,这只会是相关的 - 谢谢,但我确信自己仍然觉得值得发布。 – kevchadders 2010-10-08 13:45:00

+0

谢谢!我在这方面的矛盾讨论中被淹没了,只发现了在其他RDBMS(Oracle,PostGreSQL等)中锁定descr的参考。现在用关键短语“(Sch-S)锁定”我在搜索中处于正确的轨道。 WTF,同样的锁在不同的数据库管理系统中被称为不同的描述相同的概念... – 2010-10-08 14:29:35

1

第二个查询中的提示覆盖事务隔离级别。
SELECT ... WITH (NOLOCK)基本上与SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; SELECT ...相同。

在任何其他隔离级别的情况下,锁都会被遵守,所以第二个事务将等待,直到第一个锁释放为止。