seb*_*red 3 sql db2 transactions rollback
我正在为DB2数据库(V9.5)实现一个SQL脚本,以便添加列并重新组织数据.我想从linux命令行执行脚本:
$ db2 -vstf migration.sql
Run Code Online (Sandbox Code Playgroud)
所有语句migration.sql都应包含在事务中.如果一个语句失败,则必须回滚所有先前的更改.我怎样才能做到这一点?我尝试使用START TRANSACTION但在这种情况下DB2返回语法错误.
migration.sql
connect to ...
-- not accepted by DB2
START TRANSACTION;
update ... set ...
alter table ...
COMMIT;
connect reset;
terminate;
Run Code Online (Sandbox Code Playgroud)
此外,我试图关闭自动提交的描述在这里:
db2 +c -vstf migration.sql (在脚本中打开连接时不起作用)update command options using c off到migration.sql(错误时不回滚任何内容)那么,是否有人想要按预期在db2命令行上运行事务和回滚?如果没有,它是否适用于Java/JDBC?
从脚本中删除connect和commit,并在shell中执行此操作.然后使用+ c并测试退出状态(假设bash,应该很容易移植到其他shell):
db2 connect to <db>
db2 +c -vstf migration.sql
if [ $? -ge 4 ]; then
db2 rollback
else
db2 commit
fi
Run Code Online (Sandbox Code Playgroud)
db2返回:
* 8 on system error
* 4 db2 error (constraint violation, object not found etc)
* 2 db2 warning
* 1 no rows found
Run Code Online (Sandbox Code Playgroud)
-s将停止执行退出代码> = 4,测试检查是否发生这种情况并回滚事务.此外,您可能还想添加日志文件:
db2 -l migration.log +c -vstf migration.sql
if [ $? -ge 4 ]; then
db2 rollback
tail -10 migration.log
else
db2 commit
fi
Run Code Online (Sandbox Code Playgroud)
如果出现错误,您可以拖尾日志文件以快速找出错误.如果您使用日志文件,您可能希望删除-v,因为它有点嘈杂:
db2 -l migration.log +c -stf migration.sql
if [ $? -ge 4 ]; then
db2 rollback
tail -10 migration.log
else
db2 commit
fi
Run Code Online (Sandbox Code Playgroud)