DB2 SQL脚本:如何启动事务并在错误时回滚

3

我正在实施一个针对DB2数据库(V9.5)的SQL脚本,以添加列并重新组织数据。我希望能够从Linux命令行执行该脚本:

$ db2 -vstf migration.sql

migration.sql 中的所有语句都应该包含在一个事务中,如果有一个语句失败,则必须回滚所有先前的更改。我该怎么做?我尝试使用 START TRANSACTION ,但 DB2 在这种情况下返回语法错误。

migration.sql

    connect to ...        

    -- not accepted by DB2
    START TRANSACTION; 

    update ... set ... 
    alter table ... 

    COMMIT;

    connect reset;
    terminate;

此外,我尝试按照这里所述关闭自动提交:
  • db2 +c -vstf migration.sql(在脚本中打开连接时不起作用)
  • update command options using c off添加到migration.sql中(发生错误时不回滚任何内容)
那么,有人知道如何在db2命令行上使事务和回滚按预期工作吗?如果不行,Java/JDBC可以吗?

DB2的哪个版本?LUW,Z/OS等? - Andrew
2个回答

5

将脚本中的连接和提交移除,并在shell中执行。然后使用+c并测试退出状态(假设使用bash,应易于转换到其他shell):

db2 connect to <db>

db2 +c -vstf migration.sql
if [ $? -ge 4 ]; then
    db2 rollback
else
    db2 commit
fi

DB2返回:

* 8 on system error
* 4 db2 error (constraint violation, object not found etc)
* 2 db2 warning 
* 1 no rows found

-s 标志将停止执行退出码大于等于4的命令,该测试检查此是否发生并回滚事务。另外,您可能想要添加一个日志文件:

db2 -l migration.log +c -vstf migration.sql
if [ $? -ge 4 ]; then
    db2 rollback
    tail -10 migration.log
else
    db2 commit
fi

如果出现错误,您可以查看日志文件以快速找出错误。如果您使用日志文件,则可能需要删除-v选项,因为它有点嘈杂:

db2 -l migration.log +c -stf migration.sql
if [ $? -ge 4 ]; then
    db2 rollback
    tail -10 migration.log
else
    db2 commit
fi

严格来说,您可以在脚本中保留连接和提交,但我认为在同一级别开始事务、提交和回滚更好。 - Lennart - Slava Ukraini
请注意:某些DB2实用工具(如“重组”)将必须提交您的工作单元。由于某些“alter table”语句将要求您运行“reorg”,因此您必须考虑是否尝试在单个工作单元中完成迁移。 - Ian Bjorhovde
这是确实的。从长远来看,为数据库升级创建一个框架是有好处的。我有一个框架,在提交版本之前执行某些检查(例如无效对象)。如果出现错误,则会发出异常信号。数据库会跟踪自己的版本,因此实用程序可以跳过任何已提交的版本。在执行任何不安全事务的操作之前,实用程序会首先尝试提交该版本。 - Lennart - Slava Ukraini

0

要在命令行中禁用自动提交:

db2 => UPDATE COMMAND OPTIONS USING c OFF

查看当前设置:

db2 => LIST COMMAND OPTIONS 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接