2

我有一个 MLOAD 作业,可将 Oracle 数据库中的数据插入 Teradata 数据库。它所做的一件事就是删除目标表并重新创建它。我们的生产网站根据目标表中的内容填充下拉列表。

如果 MLOAD 脚本不在单个事务上,那么如果在 MLOAD 作业期间发生绑定,则下拉列表可能无法正确填充。但是,如果它是事务性的,那将是一个无缝的过程,因为在提交事务之前不会显示更改。

我在运行 MLOAD 作业后检查了dbc.DBQLogTblanddbc.DBQLQryLogsql视图,似乎在作业中发生了多个事务,因此看起来整个作业不是在单个事务中完成的。但是,在我做出假设之前,我想验证这确实是这种情况。

4

1 回答 1

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;

等等。当然,您的加载作业需要实现切换逻辑。

于 2014-03-03T15:26:37.893 回答