Sql-Server
從事務中創建的表中讀取
我想查看正在進行事務的表中的數據。我將以這個超級簡單的臨時表為例:
SELECT 5 AS NUMBER INTO ##temptable
我將創建一個事務來插入一個編號為 10 的新行:
BEGIN TRAN; INSERT INTO ##temptable SELECT 10 AS Number WAITFOR DELAY '00:00:20'; COMMIT TRAN;
現在,如果我打開一個新查詢並執行正常選擇語句,我將不會得到任何結果,輪子將一直旋轉,直到事務送出。我可以改為將隔離級別設置為已送出讀:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
我希望這會返回承諾的數字 5,而不是未承諾的數字 10,但我再次得到一個紡車。我想這不是它的工作原理。
如果我將隔離級別設置為未送出:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
這成功地從表中返回兩個數字。
我仍然有一個問題,因為我想像這樣在事務內部創建表:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED BEGIN TRAN; SELECT 5 AS NUMBER INTO ##temptable INSERT INTO ##temptable SELECT 10 AS Number WAITFOR DELAY '00:00:20'; COMMIT TRAN;
在這種情況下,如果我嘗試從表中讀取,即使隔離級別設置為未送出,我也會再次得到一個旋轉的輪子。
有沒有辦法從正在進行的事務中創建的表中讀取?
不,恐怕不會。創建一個表需要一個模式修改鎖,它不兼容任何東西,甚至不需要在讀取未送出時使用的模式穩定性鎖。
你很可能不得不退後一步,重新考慮你的方法。即,在事務之前創建表。