Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Por que recebo uma transação aberta ao selecionar apenas de uma exibição de banco de dados?


Ao contrário da sua expectativa, parece que o link do banco de dados é a origem da transação aberta. Eu notei um comportamento como esse antes ao executar consultas SELECT em tabelas remotas no PL/SQL Developer.

Para citar Tom Kyte ( fonte ):

EDITAR :'Qualquer instrução SQL inicia uma transação no Oracle'? Não, não, e aqui está uma demonstração disso. Esta demonstração usa a visualização do dicionário de dados V$TRANSACTION , que lista as transações ativas. Tudo isso está sendo executado no meu banco de dados Oracle XE local, que não possui outros usuários além de mim conectados a ele.

Usaremos a tabela a seguir durante esta demonstração. Ele contém apenas uma única coluna:
SQL> desc test;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 A                                                  NUMBER(38)

SQL> select count(*) from v$transaction;

  COUNT(1)
----------
         0

Nenhuma transação ativa no momento. Vamos executar uma consulta SQL nesta tabela:
SQL> select * from test;

         A
----------
         2

SQL> select count(*) from v$transaction;

  COUNT(1)
----------
         0

Ainda sem transações ativas. Agora vamos fazer algo que iniciará uma transação:
SQL> insert into test values (1);

1 row created.

SQL> select count(*) from v$transaction;

  COUNT(1)
----------
         1

Como esperado, agora temos uma transação ativa.
SQL> commit;

Commit complete.

SQL> select count(*) from v$transaction;

  COUNT(1)
----------
         0

Depois de confirmar a transação, ela não está mais ativa.

Agora, vamos criar um link de banco de dados. Estou usando o Oracle XE e o seguinte cria um link de banco de dados da minha instância do Oracle XE de volta para si mesmo:
SQL> create database link loopback_xe connect to user identified by password using 'XE';

Database link created.

Agora vamos ver o que acontece quando selecionamos da tabela sobre o link do banco de dados:
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 você pode ver, simplesmente selecionar de uma tabela remota abre uma transação.

Não sei exatamente o que há para confirmar ou reverter aqui, mas tenho que admitir que não conheço os meandros das transações distribuídas, nas quais a resposta provavelmente está.