Al contrario de lo que esperaba, parece que el enlace de la base de datos es el origen de la transacción abierta. Me he dado cuenta de este comportamiento antes al ejecutar consultas SELECT en tablas remotas en PL/SQL Developer.
Para citar Tom Kyte (source):
material distribuido inicia una transacción "por si acaso".
EDIT: 'Cualquier instrucción SQL inicia una transacción en Oracle'? No, no es así, y aquí hay una demostración de ello.Esta demostración usa la vista del diccionario de datos V$TRANSACTION, que enumera las transacciones activas. Todo esto se está ejecutando en mi base de datos Oracle XE local, que no tiene más usuarios conectados que yo.
Usaremos la siguiente tabla durante esta demostración. Contiene una sola columna:
SQL> desc test;
Name Null? Type
----------------------------------------- -------- ----------------------------
A NUMBER(38)
SQL> select count(*) from v$transaction;
COUNT(1)
----------
0
No hay transacciones activas en este momento. Vamos a ejecutar una consulta SQL en esta tabla:
SQL> select * from test;
A
----------
2
SQL> select count(*) from v$transaction;
COUNT(1)
----------
0
Todavía no hay transacciones activas. Ahora hagamos algo que inicie una transacción:
SQL> insert into test values (1);
1 row created.
SQL> select count(*) from v$transaction;
COUNT(1)
----------
1
Como era de esperar, ahora tenemos una transacción activa.
SQL> commit;
Commit complete.
SQL> select count(*) from v$transaction;
COUNT(1)
----------
0
Después de realizar la transacción, ya no está activo.
Ahora, creemos un enlace de base de datos. Estoy usando Oracle XE, y el siguiente, se crea un vínculo de base de datos de mi instancia de Oracle XE nuevo a sí mismo:
SQL> create database link loopback_xe connect to user identified by password using 'XE';
Database link created.
Ahora vamos a ver lo que sucede cuando seleccionamos de la mesa sobre el enlace de base de datos:
SQL> select count(*) from v$transaction;
COUNT(1)
----------
0
SQL> select * from [email protected]_xe;
A
----------
2
1
SQL> select count(*) from v$transaction;
COUNT(1)
----------
1
Como puede ver, simplemente seleccionando desde una tabla remota se abre una transacción.
No estoy seguro de lo que hay que comprometer o revertir aquí, pero tengo que admitir que no conozco los pormenores de las transacciones distribuidas, dentro de las cuales probablemente resida la respuesta.
Gracias. ¿Cómo se alterna el modo Auto-Commit? –
No uso PL/SQL Developer, así que no sé –
@a_horse_with_no_name: no todas las sentencias SQL inician una transacción. Ver la demostración en mi respuesta (actualizada). –