2014-03-03 23 views
2

我有一個MLOAD作業,可以將數據從Oracle數據庫插入Teradata數據庫。它所做的一件事就是丟棄目標表並重新創建它。我們的生產網站根據目標表中的內容填充下拉列表。MLOAD是否在單個事務中執行?

如果MLOAD腳本不在單個事務中,那麼如果在MLOAD作業期間發生綁定,則可能無法正確填充下拉列表。但是,如果它是事務性的,它將是一個無縫的過程,因爲只有在事務提交之前,這些更改纔會顯示出來。

我在運行MLOAD作業後檢查了dbc.DBQLogTbldbc.DBQLQryLogsql視圖,看起來作業中發生了多個事務,所以似乎整個作業不是在單個事務中完成的。但是,我想在做出假設之前確認情況確實如此。

回答

4

Teradata中的事務不能包含多個DDL語句,每個DDL必須獨立提交。

即使您在DBQL中看到多個事務,MLoad在邏輯上也被視爲單個事務,這些是準備和清理的步驟。

當你的應用程序試圖從目標表中選擇時,一切都會好的(除非它使用LOCKING ROW FOR ACCESS進行髒讀)。

順便說一下,應用程序嘗試選擇時可能會出現另一個錯誤消息「表不存在」。爲什麼要刪除/重新創建表而不是簡單的DELETE?

另一個解決方案是一個裝載表和使用視圖切換的副本:

mload tab2; 
replace view v as select * from tab2; 
delete from tab1; 

下負載會做:

mload tab1; 
replace view v as select * from tab1; 
delete from tab2; 

等。當然你的加載工作需要實現開關邏輯。

+0

想過了,你說得對,我應該刪除。我最初做到了這一點,並且工作正常,但刪除/重新創建表的邏輯是捕獲源表模式中的任何更改(varchar2長度更改,數據類型更改等)。但是,我發現MLOAD文件無論如何都不得不進行修改,所以這是一個有爭議的問題。那麼你是說插入目標表是事務性的?如果我在'insert into mydb.mytable'之前添加'delete mydb.mytable;',刪除和插入將發生在同一個事務中? – oscilatingcretin

+0

** DELETE mytable; **是在BEGIN/END MLOAD之外提交的(即支持環境命令),因此它是一個單獨的事務。但對於CREATE TABLE來說,完全相同,在創建/刪除表之後以及在MLoad鎖應用於會話可以讀取零行之前的很短時間內。視圖切換不會顯示該行爲。 – dnoeth

+0

你說得對。將刪除放在開始/結束時會打破腳本。我會做的是創建第二個重複表並使用BTEQ腳本刪除這些記錄,然後從事務中的MLOADed表插入。然後我不必使用視圖切換。 – oscilatingcretin

相關問題