当前位置: 首页 > 面试题库 >

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

壤驷志学
2023-03-14
问题内容

我正在为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?


问题答案:

从脚本中删除连接并提交,然后在外壳中执行此操作。然后使用+ 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


 类似资料:
  • 所以我最近在我的win10 PC上安装了eclipse,并创建了一个公共类。代码如下: 接下来,显示了一个错误: 然后,我删除了info.java文件,并显示以下错误: 我能做些什么来解决这个问题?

  • 问题内容: 在Amazon S3 Linux实例上,我有两个名为的脚本,它们 永远 启动和停止(依次运行Node.js应用程序)。我使用这些脚本手动启动和停止我的Node.js应用程序。到目前为止,一切都很好。 我的问题:我还想将其设置为在系统启动时运行。我知道我需要在其中添加文件,并且知道如何将其符号链接到其中的适当目录,但是我无法弄清楚放置在其中的文件中实际需要什么。我认为这应该只是一条线,例

  • 当我运行npm start时,我看到错误。 我尝试过这个方法,但没有成功:https://techoverflow.net/2019/04/01/how-to-fix-npm-err-missing-script-start/ {“private”:true,“scripts”:{“dev”:“npm运行development”,“development”:“cross-env node_env=

  • 离线时,我的服务人员会出现以下错误: 我的服务人员如下所示: 它位于顶层目录,就在索引中类似这样导入的清单的旁边。html:

  • 问题内容: 警告: 注意:如果在事务期间调用此方法,则结果是实现定义的。 这就提出了一个问题: 如何在JDBC中开始事务? 很明显,如何结束事务,但不知道如何开始事务。 如果a 从事务内部开始,我们应该如何在事务外部调用以避免特定于实现的行为? 问题答案: 回答我自己的问题: JDBC连接以启用的自动提交模式开始,在该模式下,每个SQL语句都与事务隐式地划分了界限。 希望每个事务执行多个语句的用户

  • 我使用的是Spring3.0.5和Hibernate3.6。在我的项目中,有一个场景,我必须回滚在抛出的任何异常或错误发生的事务。这是示例代码,除了当我抛出异常时事务不会回滚之外,一切都很好,但是如果抛出任何异常,比如mysql.IntegrityConstraintException,那么事务会回滚,为什么在我的情况下没有发生这种情况? hibernate.cfg 因此,正如我所说,我的问题是,