Вопреки вашим ожиданиям, похоже, что ссылка на базу данных является источником открытой транзакции.Я заметил такое поведение раньше при выполнении запросов SELECT для удаленных таблиц в PL / SQL Developer.
Цитируя Тома Кайта ( source ):
распределенный материал запускает транзакцию «на всякий случай».
EDIT : «Любой оператор SQL запускает транзакцию в Oracle»?Нет, это не так, и вот демонстрация этого.В этой демонстрации используется представление словаря данных V $ TRANSACTION , в котором перечислены активные транзакции.Все это выполняется в моей локальной базе данных Oracle XE, к которой не подключены никакие пользователи, кроме меня.
Мы будем использовать следующую таблицу во время этой демонстрации.Он содержит только один столбец:
SQL> desc test;
Name Null? Type
----------------------------------------- -------- ----------------------------
A NUMBER(38)
SQL> select count(*) from v$transaction;
COUNT(1)
----------
0
На данный момент нет активных транзакций.Давайте запустим SQL-запрос к этой таблице:
SQL> select * from test;
A
----------
2
SQL> select count(*) from v$transaction;
COUNT(1)
----------
0
Все еще нет активных транзакций.Теперь давайте сделаем что-нибудь, что запустит транзакцию:
SQL> insert into test values (1);
1 row created.
SQL> select count(*) from v$transaction;
COUNT(1)
----------
1
Как и ожидалось, теперь у нас есть активная транзакция.
SQL> commit;
Commit complete.
SQL> select count(*) from v$transaction;
COUNT(1)
----------
0
После фиксации транзакции она больше не активна.
Теперь давайте создадим ссылку на базу данных.Я использую Oracle XE, и следующее создает ссылку на базу данных из моего экземпляра Oracle XE обратно на себя:
SQL> create database link loopback_xe connect to user identified by password using 'XE';
Database link created.
Теперь давайте посмотрим, что происходит, когда мы выбираем из таблицы ссылку на базу данных:
SQL> select count(*) from v$transaction;
COUNT(1)
----------
0
SQL> select * from test@loopback_xe;
A
----------
2
1
SQL> select count(*) from v$transaction;
COUNT(1)
----------
1
Как вы можете видеть, простой выбор из удаленной таблицы открывает транзакцию.
Я не совсем точно знаю, что здесь нужно совершить или откатить, но я должен признать, что нетзная все входы и выходы распределенных транзакций, в которых, вероятно, лежит ответ.