Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle中的事务_Oracle - Fatal编程技术网

Oracle中的事务

Oracle中的事务,oracle,Oracle,我在Oracle数据库中很少有作为第三方API的存储过程,我希望在一个事务中链接这些API调用。我能做吗? 据我所知,我可以使用savepoint。但是,如果这些API已经有了commit语句,它会工作吗?Oracle是否会回滚嵌套提交 另外,Oracle如何使用保存点和并发性? 即,如果我们有图表: connection#1 (my api call) connection#2 (3rd party api call) savepoint sp1;

我在Oracle数据库中很少有作为第三方API的存储过程,我希望在一个事务中链接这些API调用。我能做吗? 据我所知,我可以使用savepoint。但是,如果这些API已经有了commit语句,它会工作吗?Oracle是否会回滚嵌套提交

另外,Oracle如何使用保存点和并发性? 即,如果我们有图表:

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),还是同时影响两行?

Oracle不会回滚嵌套提交。他们已经承诺了

您所能做的最好的事情(实际上并不是很好)是将第三方API包装在一个过程中,并用
PRAGMA autonomy\u事务标记该过程。这将限制第三方API只提交自己的工作。这意味着,如果您回滚,第三方事务工作将提交,但您所做的任何其他工作都不会提交


这通常是一件非常糟糕的事情,因为在绝大多数设计情况下,这会使数据在逻辑上受到破坏。我提到这一点的时候,你很可能会遇到这样的设计情况,你可以侥幸逃脱。

Oracle不会回滚嵌套提交。他们已经承诺了

您所能做的最好的事情(实际上并不是很好)是将第三方API包装在一个过程中,并用
PRAGMA autonomy\u事务标记该过程。这将限制第三方API只提交自己的工作。这意味着,如果您回滚,第三方事务工作将提交,但您所做的任何其他工作都不会提交


这通常是一件非常糟糕的事情,因为在绝大多数设计情况下,这会使数据在逻辑上受到破坏。我提到这一点的可能性不大,因为我们正面临着一种设计情况,在这种情况下您可以侥幸逃脱。

如果第三方过程在过程中调用commit,那么如果不修改过程本身,就无法将所有过程作为一个事务运行

Oracle不支持嵌套提交或嵌套事务。提交意味着——您正在提交将更改写入数据库,并失去回滚更改的选项

您可以使用会话参数检查第三方过程是否包含任何commit语句

alter session disable commit in procedure; 
使用此集合,任何尝试提交的过程都将抛出错误消息*

  • 感谢Matthew McPeak纠正了我对该参数作用的误解
如果第三方过程在过程中调用commit,则在不修改过程本身的情况下,无法将所有过程作为一个事务运行

Oracle不支持嵌套提交或嵌套事务。提交意味着——您正在提交将更改写入数据库,并失去回滚更改的选项

您可以使用会话参数检查第三方过程是否包含任何commit语句

alter session disable commit in procedure; 
使用此集合,任何尝试提交的过程都将抛出错误消息*

  • 感谢Matthew McPeak纠正了我对该参数作用的误解
无法回滚已提交的内容。因此,在这种情况下,调用的顺序很重要,您到底想要回滚什么。显然,您将无法回滚供应商SP已提交的工作。因此,您必须专注于自己的代码。您的代码是否取决于供应商的Sp执行结果?它在调用序列中的位置。在供应商SPS的呼叫中,它是第一个/最后一个还是在中间?话虽如此,您可以避免调用供应商的SP,或者在回滚时不可避免地进行清理(应非常小心,具体取决于这些SP的操作)。如果他们(供应商的SP)提交,则可能是“错误”,或者供应商有非常迫切的需要这样做,因此,如果你选择这样做,你需要非常小心地清理它们。你不能回滚已经提交的内容。因此,在这种情况下,调用的顺序很重要,您到底想要回滚什么。显然,您将无法回滚供应商SP已提交的工作。因此,您必须专注于自己的代码。您的代码是否取决于供应商的Sp执行结果?它在调用序列中的位置。在供应商SPS的呼叫中,它是第一个/最后一个还是在中间?话虽如此,您可以避免调用供应商的SP,或者在回滚时不可避免地进行清理(应非常小心,具体取决于这些SP的操作)。如果他们(供应商的SP)提交,则可能是“错误”,或者供应商有非常迫切的需要这样做,因此,如果你选择这样做,你需要非常小心地清理它们。