【发布时间】:2019-03-21 22:57:44
【问题描述】:
我的情况很奇怪
这有点难以解释,但我会尽力而为
包含 3 个不同的数据库
从 DB1 我调用 DB2 上的函数(通过 dblink)
该过程调用另一个将数据插入 DB3 表中的过程
DB2 上的函数具有 EXCEPTION 句柄,该句柄应该回滚它在异常情况下所做的一切
我运行了示例,一切都很顺利(没有错误),但是从过程 3 中插入的内容没有回滚,我必须从 DB1 回滚才能真正回滚
如果我从 db1 提交,则插入行
我是不是做错了什么,有没有办法直接从 db2 上的函数回滚
下面是一些示例代码:
--DB1
PROCEDURE 1
BEGIN
x := function2@dblink_to_db2();
END;
--DB2
FUNCTION 2
BEGIN
procedure3();
RAISE SOME EXCEPTION;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
do_something_else();
RETURN 0;
END;
PROCEDURE 3
BEGIN
INSERT INTO tableA@dblink_to_db3 VALUES ... ;
END;
因此不会引发错误,但不会回滚插入到 db3 上的表中
【问题讨论】:
-
我没有 3 个数据库来测试它。通过 dblink 调用始终是一个事务。无论您是进行插入还是选择。选择后,您还必须执行提交或回滚。如果在procedure3中引发异常会发生什么?
-
感谢您的回答。情况是一样的。如果我在程序 3 中引发异常,请在处理程序中回滚,同样的情况,插入的行仍然可以从 db1 中看到。顺便说一句,另一家公司的数据库正在发生这种情况。因此,对于测试,我只使用了 2 个数据库,第一个过程使用 db1,第二个和第三个过程使用 db2,然后通过 dblink 从 db2 插入回 db1。因此,如果您有 2 个数据库,那么您可以通过这种方式重新创建