Jedes verteilte SQL, sogar ein Select, öffnet eine Transaktion, die geschlossen werden muss, bevor Sie die Datenbankverbindung schließen können. Sie müssen entweder zurücksetzen oder festschreiben, bevor Sie ALTER SESSION CLOSE DATABASE LINK aufrufen.
Aber es hört sich so an, als hätten Sie bereits etwas anderes, das Ihre Transaktionen abwickelt. Wenn ein manueller Rollback oder Commit nicht möglich ist, sollten Sie versuchen, die Anzahl der offenen Links zu erhöhen. Die OPEN_LINKS Parameter ist die maximale Anzahl von Links pro Sitzung. Die Anzahl der benötigten Links hängt nicht wirklich von der Last ab, sie sollte auf der maximalen Anzahl unterschiedlicher entfernter Datenbanken basieren.
Bearbeiten:
Die Situation, die Sie in Ihrem Kommentar beschreiben, sollte nicht passieren. Ich verstehe nicht genug von Ihrem System, um zu wissen, was wirklich mit den Transaktionen passiert. Wie auch immer, wenn Sie nicht genau herausfinden können, was das System tut, können Sie vielleicht "alter session close database link" durch eine Prozedur wie diese ersetzen:
create or replace procedure rollback_and_close_db_links authid current_user is
begin
rollback;
for links in (select db_link from v$dblink) loop
execute immediate 'alter session close database link '||links.db_link;
end loop;
end;
/
Wahrscheinlich benötigen Sie diese Förderung:
grant select on v_$dblink to [relevant user];