Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Dlaczego otrzymuję otwartą transakcję, po prostu wybierając widok z bazy danych?

Wbrew oczekiwaniom wygląda na to, że link do bazy danych jest źródło otwartej transakcji. Zauważyłem takie zachowanie już wcześniej podczas uruchamiania zapytań SELECT na zdalnych tabelach w PL/SQL Developer.

Cytując Toma Kyte ( źródło ):

EDYTUJ :'Każda instrukcja SQL uruchamia transakcję w Oracle'? Nie, nie ma, a oto demonstracja tego. Ta demonstracja korzysta z widoku słownika danych V$TRANSACTION , który zawiera listę aktywnych transakcji. To wszystko działa w mojej lokalnej bazie danych Oracle XE, do której nie są podłączeni inni użytkownicy niż ja.

Podczas tej demonstracji użyjemy poniższej tabeli. Zawiera tylko jedną kolumnę:

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

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

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

Brak aktywnych transakcji w tej chwili. Uruchommy zapytanie SQL w tej tabeli:

SQL> select * from test;

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

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

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

Wciąż brak aktywnych transakcji. Teraz zróbmy coś, co rozpocznie transakcję:

SQL> insert into test values (1);

1 row created.

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

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

Zgodnie z oczekiwaniami mamy teraz aktywną transakcję.

SQL> commit;

Commit complete.

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

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

Po zatwierdzeniu transakcji nie jest już aktywna.

Teraz stwórzmy link do bazy danych. Używam Oracle XE, a następujące elementy tworzą łącze bazy danych z mojej instancji Oracle XE z powrotem do siebie:

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

Database link created.

Zobaczmy teraz, co się stanie, gdy wybierzemy z tabeli nad łączem do bazy danych:

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 widać, po prostu wybranie ze zdalnego stołu otwiera transakcję.

Nie jestem pewien, co dokładnie mam tutaj zatwierdzić lub cofnąć, ale muszę przyznać, że nie znam tajników rozproszonych transakcji, w których prawdopodobnie leży odpowiedź.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Błąd instrukcji MERGE Oracle (ORA-30926)

  2. Jak wybrać pole varchar2 w formacie 'HH24:MI:SSxFF6' jako PRZERWA GODZINA DO SEKUND (6)?

  3. Podłączanie Oracle 21c do SQL Server

  4. istnieje zachowanie sprzężenia wewnętrznego wewnątrz sql

  5. Funkcja HEXTORAW() w Oracle