如何在 ibm db2 中执行事务

How perform a transaction in ibm db2

我正在处理一个帐户 table

我尝试 运行 这个 sql 将资金从一个帐户转移到另一个帐户。

savepoint first_savepoint on rollback retain cursors;
update accounts set accbalance = accbalance -50
where accnumber = 'C-009';
update accounts set accbalance = accbalance +50
where accnumber = 'C-009';
rollback to savepoint first_savepoint;

我遇到了这个错误

savepoint "FIRST_SAVEPOINT" does not exist or is invalid in this context.. SQLCODE=8080, SQLSTATE=3B001, DRIVER=3.69.56

我能做什么? 我正在使用 IBM Data Studio 4.1.2 和 IBM DB2 Express-C

感谢大家的帮助

在 Db2-LUW 中,所有语句都在一个事务中自动执行。

事务从前一个事务结束后或连接后的第一个语句开始。事务在有 COMMIT 或 ROLLBACK 时结束..

但是任何 COMMIT 都可以在您的代码中是显式的,也可以由提交 SQL 的工具(在本例中为 IBM Data Studio)通过 autocommit 隐式生成在每一行之后。通常自动提交是此类工具的默认行为,但可以配置。

您可以配置 IBM Data Studio(以及任何其他类似工具)以禁用自动提交,然后强制您显式使用 COMMIT 或 ROLLBACK 来结束事务。

当您希望多个语句以原子方式执行时,您有以下选择:

  • 您可以禁用自动提交,运行 更新语句和显式 COMMIT

  • 或者,无论自动提交设置如何,您都可以使用匿名块,前提是您将 SQL 提交工具(即 Data Studio)配置为使用替代分隔符来指示结束块的(例如,使用 @ 作为块分隔符),然后像这样使用 SQL:

`

begin atomic
   update accounts set accbalance = accbalance -50
   where accnumber = 'C-009';
   update accounts set accbalance = accbalance +50
   where accnumber = 'C-009';
   commit;
end@

`

如果您不想使用匿名块,那么您的代码可以(禁用自动提交)读取:

commit;  -- if you want to end any previous transaction
update accounts set accbalance = accbalance -50
where accnumber = 'C-009';
update accounts set accbalance = accbalance +50
where accnumber = 'C-009';
commit;

请注意,您不需要使用问题中显示的显式 SAVEPOINTS。当且仅当您想将事务分解为不同的语句组时,您才需要使用显式保存点,并且每个组都可以在 Db2 定义的约束内单独撤消。

默认情况下,自动提交在 db2 cli 中处于活动状态。

db2 -tvf 运行s 处于自动提交模式。

要关闭自动提交,您必须运行使用 +c 选项启动 db2 cli

db2 +c -tvf

然后: db2 +c “提交” 要么 db2 +c“回滚”