sql >> Database >  >> RDS >> Oracle

Waarom krijg ik een openstaande transactie als ik gewoon uit een databaseweergave kies?

In tegenstelling tot uw verwachting lijkt het erop dat de databaselink is de bron van de openstaande transactie. Ik heb dit gedrag eerder opgemerkt bij het uitvoeren van SELECT-query's op externe tabellen in PL/SQL Developer.

Om Tom Kyte te citeren ( bron ):

BEWERKEN :'Elk SQL-statement start een transactie in Oracle'? Nee, dat doet het niet, en hier is een demonstratie ervan. Deze demonstratie gebruikt de data dictionary-weergave V$TRANSACTION , die de actieve transacties weergeeft. Dit draait allemaal op mijn lokale Oracle XE-database, waarop geen andere gebruikers dan ik zijn aangesloten.

We gebruiken de volgende tabel tijdens deze demonstratie. Het bevat slechts een enkele kolom:

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

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

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

Momenteel geen actieve transacties. Laten we een SQL-query uitvoeren op deze tabel:

SQL> select * from test;

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

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

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

Nog steeds geen actieve transacties. Laten we nu iets doen waardoor een transactie wordt gestart:

SQL> insert into test values (1);

1 row created.

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

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

Zoals verwacht hebben we nu een actieve transactie.

SQL> commit;

Commit complete.

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

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

Nadat de transactie is uitgevoerd, is deze niet langer actief.

Laten we nu een databasekoppeling maken. Ik gebruik Oracle XE en het volgende maakt een databaselink van mijn Oracle XE-instantie terug naar zichzelf:

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

Database link created.

Laten we nu eens kijken wat er gebeurt als we selecteren uit de tabel via de databaselink:

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

Zoals u kunt zien, opent u eenvoudigweg een transactie aan een tafel op afstand.

Ik weet niet precies wat hier moet worden vastgelegd of teruggedraaid, maar ik moet toegeven dat ik de ins en outs van gedistribueerde transacties niet ken, waarbinnen het antwoord waarschijnlijk ligt.



  1. Hoe postgresql postgresql.conf listen_addresses voor meerdere ip-adressen te configureren

  2. Verbinding met MySQL-server verbroken bij 'initieel communicatiepakket lezen', systeemfout:0

  3. Voorloop- en volgtekens verwijderen in SQL Server

  4. Fout bij het uitvoeren van migraties:sqlalchemy.exc.CompileError:Postgresql ENUM-type vereist een naam