我需要在查询中调用远程数据库(由公共数据库链接定义)上的函数。一切都按预期工作,除了在SQL Developer中从本地数据库连接中选择“断开连接”时,它会打开对话框:
连接“localDB”具有未经修改的更改....
即使远程函数只从表读取,并且调用查询不是更新/插入/删除。我担心使用这种架构可能会导致将来本地数据库中未完成的事务减少资源的问题。
尝试过使用“PRAGMA AUTONOMOUS_TRANSACTION”;远程数据库中的指令,但无济于事。有什么建议吗?
以下演示了我遇到的行为:
RemoteDB功能:
create or replace
FUNCTION FN_test (inempid in number) RETURN varchar2 is PRAGMA AUTONOMOUS_TRANSACTION;
sReturn varchar2(20);
BEGIN
sReturn:=to_char(sysdate,'dd-Mon-yyyy HH24:mi');
return sReturn;
END FN_test;
从localDB调用:
select fn_test@RemoteDB.World(123) from Dual;
谢谢!
答案 0 :(得分:1)
任何远程调用都会打开事务 - 即使这只执行查询。 Oracle无法预测您在远程端的确切操作,并尝试阻止未提交的分布式事务。 在下面的示例中,我仅创建连接到本机主机的本地数据库链接,并使用db链接从DUAL表中请求数据。 Oracle在响应中打开了本地事务:
SQL> create database link locallink connect to scott identified by tiger
2 using '127.0.0.1:1521/test';
Database link created.
SQL> select dbms_transaction.local_transaction_id from dual;
LOCAL_TRANSACTION_ID
--------------------------------------------------------------------------------
SQL> select * from dual@locallink;
D
-
X
SQL> select dbms_transaction.local_transaction_id from dual;
LOCAL_TRANSACTION_ID
--------------------------------------------------------------------------------
17.13.10520
自主交易没用,因为它打开和关闭与主要交易不同的交易。因此,如果使用远程调用,则需要在主事务中提交更改。