我有一个 MLOAD 作业,它将数据从 Oracle 数据库插入到 Teradata 数据库中。它所做的事情之一是删除目标表并重新创建它。我们的生产网站根据目标表中的内容填充下拉列表。
如果 MLOAD 脚本不在单个事务上,则在 MLOAD 作业期间发生绑定(bind)时,下拉列表可能无法正确填充。但是,如果它是事务性的,那么这将是一个无缝过程,因为只有在提交事务后更改才会显示。
运行 MLOAD 作业后,我检查了 dbc.DBQLogTbl
和 dbc.DBQLQryLogsql
View ,作业中似乎发生了多个事务,因此看起来整个工作不是在单个事务中完成的。不过,我想在做出假设之前先验证一下情况是否确实如此。
最佳答案
Teradata 中的事务不能包含多个 DDL 语句,每个 DDL 必须单独提交。
即使您在 DBQL 中看到多个事务,MLoad 在逻辑上也被视为单个事务,这些是准备和清理的步骤。
当您的应用程序尝试从目标表中进行选择时,一切都会正常(除非它使用 LOCKING ROW FOR ACCESS 进行脏读)。
顺便说一句,当应用程序尝试选择时,可能会出现另一条错误消息“表不存在”。为什么要删除/重新创建表而不是简单的删除?
另一个解决方案是加载表的副本并使用 View 切换:
mload tab2;
replace view v as select * from tab2;
delete from tab1;
下一次加载即可:
mload tab1;
replace view v as select * from tab1;
delete from tab2;
等等。当然,您的加载作业需要实现切换逻辑。
关于teradata - MLOAD 是在单个事务中执行的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22149765/