MLOAD是在单个事务中执行的吗?

时间:2014-03-03 14:49:07

标签: teradata mload

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

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

我在运行MLOAD作业后检查了dbc.DBQLogTbldbc.DBQLQryLogsql个视图,看来作业中发生了多个事务,所以看起来整个作业都没有在一个事务中完成。但是,我想在做出假设之前验证确实是这种情况。

1 个答案:

答案 0 :(得分: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;

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