2017-07-19 22 views
0

我期待通過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; 
+0

1.使用視圖而不是表格來讀取數據。 2.加載時刪除視圖。 3.加載完成後重新創建視圖。就我所知,你也可以使用mload來處理你所有的鎖定。 – Andrew

+0

爲什麼不使用TASM來拒絕(或延遲)針對在ETL期間加載的表(或數據庫)的請求?不理想的解決方案,但解決了鎖定隔離或者,您可以使用隊列表和在視圖中使用嵌套SELECT語句定義的列:最終用戶訪問嘗試訪問隊列表中的令牌的表。如果令牌丟失,則查詢進入QT_DELAYED狀態。 –

+0

@RobPaller在研究TASM和查看隊列表的例子時,似乎涉及到很多設置和/或樣板。不是說他們不會工作,而只是想在存儲過程中找到一種方法(即不是BTEQ之類),1)在表上放置一個排它鎖,2)執行多個語句表),然後3)釋放鎖。dnoeth的答案*出現*,以確認我的OP代碼將完全做到這一點,儘管暫時日誌的潛在性能受到了影響,我還不太明白。 – oscilatingcretin

回答

0

BEGIN REQUEST/END REQUEST創建一個所謂的多語句請求(MSR),這是同一個使用F9在提交SQL助理兩個請求。

要查看計劃,F9運行這個命令:

EXPLAIN 
locking mydb.destinationtable for exclusive 
delete mydb.destinationtable; 

insert into mydb.destinationtable 
select * from mydb.sourcetable; 

或BTEQ:

EXPLAIN 
locking mydb.destinationtable for exclusive 
delete mydb.destinationtable 
;insert into mydb.destinationtable 
select * from mydb.sourcetable; 

順便說一句,第二鎖是多餘的。

但是。當您運行刪除& InsSel作爲單個事務時,兩者都將爲瞬時日誌。哪個是太多慢於單獨的請求。

更常見的方式做,這是使用的目標表和基本訪問兩個副本上看到的不是表:

-- no BEGIN/END REQUEST 
insert into mydb.destinationtable_2 
select * from mydb.sourcetable; 

-- there's just a short dictionary lock 
-- all requests against the view submitted before the replace use the old data 
-- and all submitted after the new data 
replace view myview as 
select * from mydb.destinationtable_2; 

delete from mydb.destinationtable_1; 

現在你的SP只需要邏輯之間(以1 & 2切換表[不]空

+0

我真的想避免交換表/視圖。在存儲過程的整個過程中,是否沒有辦法在表上獨佔鎖定?就冗餘鎖而言,你是否只是在DELETE期間放置鎖纔會將鎖應用於INSERT?至於被暫時記錄,是否有辦法在同一事務下將兩者作爲單獨的語句運行,同時還能夠獨佔地鎖定我的表,直到事務提交爲止? – oscilatingcretin

+0

至於爲什麼我不想交換資源,這是因爲我想模擬Oracle的快照隔離。也許在幕後,Oracle正在做同樣的事情,但這是隱含的。我不想在Teradata中手動模擬這種類型的隔離。 – oscilatingcretin

+0

當您執行MSR時,您會在優化器的單個請求中同時發送DEL和INS/SEL,因此優化器會知道這兩個語句訪問同一個表並應用最嚴格的鎖定。爲什麼你認爲你需要快照隔離,無論如何不是倉庫?你正在處理什麼類型的數據以及你運行該程序的頻率? – dnoeth

相關問題