如何在 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“回滚”
我正在处理一个帐户 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
要关闭自动提交,您必须运行使用 +c 选项启动 db2 cli
db2 +c -tvf
然后: db2 +c “提交” 要么 db2 +c“回滚”