MLOAD 是否在单个事务中执行



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

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

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

Teradata 中的事务不能包含多个 DDL 语句,每个 DDL 必须单独提交。

MLoad 在逻辑上被视为单个事务,即使您在 DBQL 中看到多个事务,这些是准备和清理的步骤。

当您的应用程序尝试从目标表中进行选择时,一切正常(除非它使用"用于访问的锁定行"进行脏读)。

顺便说一句,当应用程序尝试选择时,可能会出现另一条错误消息"表不存在"。为什么要删除/重新创建表而不是简单的 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;

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

最新更新