sql >> Databáze >  >> RDS >> Oracle

Proč dostanu otevřenou transakci při pouhém výběru z databáze View?

Na rozdíl od vašeho očekávání to vypadá, že odkaz na databázi je zdroj otevřené transakce. Podobné chování jsem si všiml již dříve při spouštění dotazů SELECT na vzdálené tabulky v PL/SQL Developer.

Abych citoval Toma Kytea ( zdroj ):

UPRAVIT :'Jakýkoli příkaz SQL zahájí transakci v Oracle'? Ne, nemá a zde je jeho ukázka. Tato ukázka používá zobrazení datového slovníku V$TRANSACTION , který uvádí aktivní transakce. To vše běží na mé místní databázi Oracle XE, ke které nejsou připojeni žádní uživatelé kromě mě.

Během této ukázky použijeme následující tabulku. Obsahuje pouze jeden sloupec:

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

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

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

Momentálně nejsou žádné aktivní transakce. Spusťte SQL dotaz proti této tabulce:

SQL> select * from test;

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

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

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

Stále žádné aktivní transakce. Nyní udělejme něco, co zahájí transakci:

SQL> insert into test values (1);

1 row created.

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

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

Podle očekávání máme nyní aktivní transakci.

SQL> commit;

Commit complete.

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

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

Po potvrzení transakce již není aktivní.

Nyní vytvoříme odkaz na databázi. Používám Oracle XE a následující vytvoří odkaz na databázi z mé instance Oracle XE zpět na sebe:

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

Database link created.

Nyní se podívejme, co se stane, když vybereme z tabulky přes odkaz na databázi:

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

Jak vidíte, jednoduchý výběr ze vzdáleného stolu otevře transakci.

Nejsem si jistý, co přesně je zde k potvrzení nebo vrácení, ale musím přiznat, že neznám výhody a nevýhody distribuovaných transakcí, v nichž pravděpodobně leží odpověď.



  1. OSX 10.9 Mavericks a Eclipse Kepler (4.3.2) nebo M6 Eclipse Luna (4.4)

  2. Průvodce Entity Data Wizard Entity Framework selže při připojování k databázi MySQL

  3. Přeměna libovolně mnoha řádků na sloupce v PostgreSQL

  4. Spusťte dotaz db (sql server 2005) s ajaxem. Je to možné?