2010-10-08 44 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 ...相同。

在任何其他隔離級別的情況下,鎖都會被遵守,所以第二個事務將等待,直到第一個鎖釋放爲止。