sql >> Base de Datos >  >> RDS >> Oracle

¿Por qué obtengo una transacción abierta cuando solo selecciono de una vista de base de datos?

Al contrario de lo que esperaba, parece que el enlace de la base de datos es el origen de la transacción abierta. He notado un comportamiento como este antes al ejecutar consultas SELECT en tablas remotas en PL/SQL Developer.

Para citar a Tom Kyte ( fuente ):

EDITAR :'Cualquier instrucción SQL inicia una transacción en Oracle'? No, no lo hace, y aquí hay una demostración de ello. Esta demostración utiliza la vista del diccionario de datos V$TRANSACTION , que enumera las transacciones activas. Todo esto se ejecuta en mi base de datos Oracle XE local, que no tiene otros usuarios conectados a ella.

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. Ejecutemos 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 confirmar la transacción, ya no está activa.

Ahora, vamos a crear un enlace de base de datos. Estoy usando Oracle XE, y lo siguiente crea un enlace de base de datos desde mi instancia de Oracle XE hacia sí mismo:

SQL> create database link loopback_xe connect to user identified by password using 'XE';

Database link created.

Ahora veamos qué sucede cuando seleccionamos de la tabla sobre el enlace de la 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 mesa remota se abre una transacción.

No estoy seguro exactamente de lo que hay que confirmar o revertir aquí, pero debo admitir que no conozco los entresijos de las transacciones distribuidas, dentro de las cuales probablemente se encuentre la respuesta.