【发布时间】:2016-10-10 14:59:36
【问题描述】:
我在 Oracle 数据库中作为第三方 API 的存储过程很少,我想在一个事务中链接这些 api 调用。我可以做吗? 据我了解that answer 我可以使用保存点。但是,如果这些 API 已经有提交语句,它是否有效? Oracle 是否会回滚嵌套提交?
另外,Oracle 如何处理保存点和并发? IE。如果我们有图表:
connection#1 (my api call) connection#2 (3rd party api call)
savepoint sp1;
savepoint sp2;
update t1 where id=1 set val=1; update t1 where id=2 set val=2;
commit; --done
call bad_stored_proc();
rollback to sp1;
这里会发生什么?回滚会仅影响行 (id=1,val=1),还是同时影响两行?
【问题讨论】:
-
您无法回滚已经提交的内容。所以在这种情况下,调用的顺序很重要,以及你想要回滚的究竟是什么。显然,您将无法回滚供应商 SP 的承诺工作。所以你必须专注于你自己的代码。你的代码是否依赖于厂商的 Sp 执行结果?它在调用顺序中的位置。它是第一个/最后一个还是在调用供应商的 SP 的中间?话虽如此,当您回滚时,您可以避免调用供应商的 sps,或者如果不可避免地在它们之后进行清理(应该非常小心,取决于那些 SP 所做的事情)。
-
如果他们(供应商的 SP)提交,这可能是一个“错误”或者供应商非常迫切地需要这样做,因此如果您选择这样做,您需要非常小心地清理它们这样做。
标签: oracle