Sql-Server

從事務中創建的表中讀取

  • May 27, 2022

我想查看正在進行事務的表中的數據。我將以這個超級簡單的臨時表為例:

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;

在這種情況下,如果我嘗試從表中讀取,即使隔離級別設置為未送出,我也會再次得到​​一個旋轉的輪子。

有沒有辦法從正在進行的事務中創建的表中讀取?

不,恐怕不會。創建一個表需要一個模式修改鎖,它不兼容任何東西,甚至不需要在讀取未送出時使用的模式穩定性鎖。

你很可能不得不退後一步,重新考慮你的方法。即,在事務之前創建表。

引用自:https://dba.stackexchange.com/questions/312655