2015-03-02 119 views
0

研究隔離級別和阻塞,更具體的READ COMMITTED與READ COMMITTED SNAPSHOT。事務隔離級別 - Azure SQL數據庫中的表鎖定

在SQL Server 2014默認的隔離級別讀取已提交,如果我跑

BEGIN TRANSACTION 
SELECT top 1 * FROM Person.Person WITH (TABLOCKX, HOLDLOCK); 
WAITFOR DELAY '03:00:00' 
ROLLBACK TRANSACTION 

,然後在一個新的連接

SELECT * FROM Person.Person 

第二個查詢將阻止掛。

但是在Azure SQL中,隔離級別是READ COMMITTED SNAPSHOT,它似乎允許從Person.Person讀取TABLOCKX + HOLDLOCK'ed tx等待。

問題:如何重新創建阻塞方案,可能帶有提示,強制第一個SELECT在READ COMMITTED SNAPSHOT的同時完全阻塞表? - 因爲它在Azure SQL中並且不能更改。

我曾嘗試:

SET TRANSACTION ISOLATION LEVEL READ COMMITTED 
SELECT top 1 * FROM Person.Person WITH (TABLOCKX, HOLDLOCK); 
BEGIN TRANSACTION 
... 

BEGIN TRANSACTION 
SELECT top 1 * FROM Person.Person WITH (READCOMMITTED); 
... 

謝謝。

回答

0

我無法重現您描述的情況。在常規(2012非Azure SQL Server數據庫)中打開隔離級別以進行快照,其中包括: 在 上設置allow_snapshot_isolation並創建表dbo.x5並填充它。在一個會議上,我跑:

開始交易

選擇前1 *從(TABLOCKX,HOLDLOCK)dbo.x5;

WAITFOR DELAY '03:00:00'

ROLLBACK TRANSACTION

,並在其他我跑

組的事務隔離級別快照

開始交易

SELECT * from dbo.x5 with(readcommitted)

第二次會話掛起。

如果我不添加「READCOMMITTED」暗示它讀取(沒有塊快照隔離讀取。)

根據文獻Azure和非天青之間的主要區別是默認的鎖定設置,但一旦它設置它的行爲方式相同。