T-Sql

在 Azure SQL DataWarehouse 中為 CTAS upsert 鎖定表

  • October 21, 2021

我在 Azure SQL 數據倉庫中有一個類型 2 維度。

本質上,我正在創建一個臨時表

CREATE TABLE myDimension_temp
AS 
SELECT
...
FROM myStagingTable;

ETC

CTAS 完成後,我做了一個

RENAME OBJECT myDimension TO myDimension_old;
RENAME OBJECT myDimension_tmp TO myDimension;
DROP TABLE myDimension_old;

有沒有辦法鎖定這些表,以便在兩個表的重命名完成之前阻止對 myDimension 的任何操作?

如果是這樣,這是否值得實施,或者以這種方式換出表格所需的時間可以忽略不計,以至於發生這種情況的可能性太小而無法擔心,或者我是否以完全錯誤的方式看待/處理這個問題?

Azure SQL 數據倉庫中通常沒有獨占鎖定,因為預設隔離級別READ UNCOMMITTED如此所述。

對此的其他方法,例如sp_get_applock也是不可用的。因此,您基於低並發和工作流進行管理,即不允許使用者在更新期間連接到您的倉庫,或者使用某種在操作期間必須檢查的標誌。

RENAME 不是事務性的,即begin transaction .. rename ..會拋出錯誤。因此,任何在重命名表之前獲得排他鎖的嘗試都是徒勞的,因為獲取鎖的事務必須在 RENAME 執行之前結束(並釋放鎖)。

您最好的選擇是在交換期間安排不訪問。如果必須進行訪問,則必須寫入允許在暗表不存在的短暫時間間隔內發生故障。

另一種方法是使用全表分區切換alter table Source switch to Target。我不知道這在您的上下文中是否有更好的鎖定特性。它的優點是所有表始終存在,因此查詢不會失敗。但是,它們將返回零行,因此必須考慮這一點。

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