T-Sql
在 Azure SQL DataWarehouse 中為 CTAS upsert 鎖定表
我在 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
。我不知道這在您的上下文中是否有更好的鎖定特性。它的優點是所有表始終存在,因此查詢不會失敗。但是,它們將返回零行,因此必須考慮這一點。