我期待通過Teradata事務實現等效的快照隔離。 Oracle支持這種類型的隔離,但Teradata不支持(至少在我知道的版本14或之前版本中)。我們的目標是創建一個過程,刪除表的內容,然後將其全部重新填充,同時防止其他用戶讀取/寫入表。在存儲過程中的多個語句期間鎖定一個表
我遇到了begin request
聲明,根據我的理解,聲明允許優化器瞭解請求中的所有各種表鎖。
我寫了下面的程序,但不知道如何可靠地調試它,就像在.NET應用程序中測試線程鎖定一樣容易(易於設置斷點和監視其他線程)。在Teradata,不知道我在這裏寫的是否會在程序期間專門鎖定mydb.destinationtable
。它是否正確?
編輯:我會補充說,該過程確實有效。它只是在正在執行DELETE/INSERT時能夠正確地計時SELECT。
replace procedure mydb.myproc()
begin
begin request
locking mydb.destinationtable for exclusive
delete mydb.destinationtable;
locking mydb.destinationtable for exclusive
insert into mydb.destinationtable
select * from mydb.sourcetable;
end request;
end;
1.使用視圖而不是表格來讀取數據。 2.加載時刪除視圖。 3.加載完成後重新創建視圖。就我所知,你也可以使用mload來處理你所有的鎖定。 – Andrew
爲什麼不使用TASM來拒絕(或延遲)針對在ETL期間加載的表(或數據庫)的請求?不理想的解決方案,但解決了鎖定隔離或者,您可以使用隊列表和在視圖中使用嵌套SELECT語句定義的列:最終用戶訪問嘗試訪問隊列表中的令牌的表。如果令牌丟失,則查詢進入QT_DELAYED狀態。 –
@RobPaller在研究TASM和查看隊列表的例子時,似乎涉及到很多設置和/或樣板。不是說他們不會工作,而只是想在存儲過程中找到一種方法(即不是BTEQ之類),1)在表上放置一個排它鎖,2)執行多個語句表),然後3)釋放鎖。dnoeth的答案*出現*,以確認我的OP代碼將完全做到這一點,儘管暫時日誌的潛在性能受到了影響,我還不太明白。 – oscilatingcretin