【问题标题】:Is MLOAD executed in a single transaction?MLOAD 是否在单个事务中执行?
【发布时间】:2014-03-03 23:26:37
【问题描述】:

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

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

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

【问题讨论】:

    标签: teradata mload


    【解决方案1】:

    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;
    

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

    【讨论】:

    • 想了想,你说得对,我应该直接删除。我最初这样做并且效果很好,但是删除/重新创建表背后的逻辑是捕获源表架构中的任何更改(varchar2 长度更改、数据类型更改等)。但是,我想到无论如何都必须修改 MLOAD 文件,所以这是一个有争议的问题。那么你是说插入到目标表是事务性的?如果我在insert into mydb.mytable之前添加delete mydb.mytable;,删除和插入将发生在同一个事务中?
    • DELETE mytable; 在 BEGIN/END MLOAD 之外提交(即支持环境命令),因此它是一个单独的事务。但是对于 CREATE TABLE 来说完全一样,在创建/删除表之后和应用 MLoad 锁之前有很短的时间,会话可以读取零行。视图切换不会显示该行为。
    • 你是对的。将删除放在开始/结束中会破坏脚本。我要做的是创建第二个重复表并使用 BTEQ 脚本删除这些记录,然后在事务中从 MLOADed 表中插入。这样我就不必使用视图切换了。
    猜你喜欢
    • 2015-07-16
    • 2019-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-30
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    相关资源
    最近更新 更多