sql >> Databasteknik >  >> RDS >> Oracle

Varför får jag en öppen transaktion när jag bara väljer från en databasvy?

Tvärtemot dina förväntningar ser det ut som att databaslänken är källan till den öppna transaktionen. Jag har märkt beteende som detta tidigare när jag kör SELECT-frågor på fjärrtabeller i PL/SQL Developer.

För att citera Tom Kyte ( källa ):

REDIGERA :'Någon SQL-sats startar en transaktion i Oracle'? Nej, det gör det inte, och här är en demonstration av det. Den här demonstrationen använder dataordbokvyn V$TRANSACTION , som listar de aktiva transaktionerna. Allt detta körs på min lokala Oracle XE-databas, som inte har några andra användare än jag anslutna till den.

Vi kommer att använda följande tabell under denna demonstration. Den innehåller bara en kolumn:

SQL> desc test;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 A                                                  NUMBER(38)

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

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

Inga aktiva transaktioner för tillfället. Låt oss köra en SQL-fråga mot denna tabell:

SQL> select * from test;

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

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

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

Fortfarande inga aktiva transaktioner. Låt oss nu göra något som startar en transaktion:

SQL> insert into test values (1);

1 row created.

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

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

Som väntat har vi nu en aktiv transaktion.

SQL> commit;

Commit complete.

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

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

Efter att ha genomfört transaktionen är den inte längre aktiv.

Låt oss nu skapa en databaslänk. Jag använder Oracle XE, och följande skapar en databaslänk från min Oracle XE-instans tillbaka till sig själv:

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

Database link created.

Låt oss nu se vad som händer när vi väljer från tabellen över databaslänken:

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

Som du kan se öppnar du en transaktion genom att helt enkelt välja från ett fjärrbord.

Jag är inte säker på exakt vad som finns att begå eller återställa här, men jag måste erkänna att jag inte känner till detaljerna i distribuerade transaktioner, där svaret förmodligen ligger.



  1. kan inte ange måltabell för UPDATE i FROM-satsen

  2. Transaktion nödvändig för en enda uppdateringsfråga?

  3. MySQL - Problem med att skapa användardefinierad funktion (UDF)

  4. headers som redan har skickats genom spolningsfunktionen?