我有一个 MLOAD 作业,它将 Oracle 数据库中的数据插入到 Teradata 数据库中。 它所做的一件事是删除目标表并重新创建它。 我们的生产网站根据目标表中的内容填充下拉列表。
如果 MLOAD 脚本不在单个事务上,则在 MLOAD 作业期间发生绑定时,下拉列表可能无法正确填充。 但是,如果它是事务性的,这将是一个无缝的过程,因为在提交事务之前不会显示更改。
运行 MLOAD 作业后,我检查了dbc.DBQLogTbl
和dbc.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;
等等。当然,您的加载作业需要实现切换逻辑。