首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DB2 SQL脚本:如何启动事务并在出错时回滚

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

Stack Overflow用户
提问于 2014-08-25 20:43:36
回答 2查看 17.4K关注 0票数 3

我正在为DB2数据库(V9.5)实现一个SQL脚本,以便添加列和重新组织数据。我想从linux命令行执行脚本:

代码语言:javascript
复制
$ db2 -vstf migration.sql

migration.sql中的所有语句都应该包装在事务中。如果一条语句失败,所有以前的更改都必须回滚。我怎么能这么做?我尝试使用START TRANSACTION,但在本例中DB2返回一个语法错误。

migration.sql

代码语言:javascript
复制
    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?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-25 21:32:09

从脚本中移除连接和提交,并在shell中这样做。然后使用+c并测试退出状态(假设bash很容易移植到其他shell):

代码语言:javascript
复制
db2 connect to <db>

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

db2返回:

代码语言:javascript
复制
* 8 on system error
* 4 db2 error (constraint violation, object not found etc)
* 2 db2 warning 
* 1 no rows found

-s将停止执行退出代码>= 4,测试将检查是否发生这种情况,并回滚事务。此外,您可能希望添加一个日志文件:

代码语言:javascript
复制
db2 -l migration.log +c -vstf migration.sql
if [ $? -ge 4 ]; then
    db2 rollback
    tail -10 migration.log
else
    db2 commit
fi

如果出现错误,您可以跟踪日志文件,以快速找到错误所在。如果您使用日志文件,您可能希望删除-v,因为它有点嘈杂:

代码语言:javascript
复制
db2 -l migration.log +c -stf migration.sql
if [ $? -ge 4 ]; then
    db2 rollback
    tail -10 migration.log
else
    db2 commit
fi
票数 5
EN

Stack Overflow用户

发布于 2014-08-25 21:35:42

若要禁用命令行的自动提交,请执行以下操作:

代码语言:javascript
复制
db2 => UPDATE COMMAND OPTIONS USING c OFF

要查看当前设置,请执行以下操作:

代码语言:javascript
复制
db2 => LIST COMMAND OPTIONS 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25494089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档