Oracle
 sql >> база данни >  >> RDS >> Oracle

Защо получавам отворена транзакция, когато просто избирам от изглед на база данни?

Противно на вашите очаквания, изглежда, че връзката към базата данни е източникът на отворената транзакция. Забелязал съм поведение като това преди, когато изпълнявам SELECT заявки на отдалечени таблици в PL/SQL Developer.

Да цитирам Том Кайт ( източник ):

РЕДАКТИРАНЕ :„Всеки SQL оператор стартира транзакция в Oracle“? Не, не е и ето демонстрация за това. Тази демонстрация използва изгледа на речника на данните V$TRANSACTION , който изброява активните транзакции. Всичко това работи в моята локална база данни на Oracle XE, към която няма други потребители, свързани с мен.

Ще използваме следната таблица по време на тази демонстрация. Съдържа само една колона:

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

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

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

В момента няма активни транзакции. Нека изпълним SQL заявка към тази таблица:

SQL> select * from test;

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

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

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

Все още няма активни транзакции. Сега нека направим нещо, което ще започне транзакция:

SQL> insert into test values (1);

1 row created.

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

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

Както очаквахме, сега имаме активна транзакция.

SQL> commit;

Commit complete.

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

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

След извършване на транзакцията тя вече не е активна.

Сега нека създадем връзка към база данни. Използвам Oracle XE и следното създава връзка към база данни от моето копие на Oracle XE обратно към себе си:

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

Database link created.

Сега нека видим какво се случва, когато изберем от таблицата през връзката към базата данни:

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

Както можете да видите, просто избиране от отдалечена таблица отваря транзакция.

Не съм сигурен какво точно има за ангажиране или връщане тук, но трябва да призная, че не знам тънкостите на разпределените транзакции, в които вероятно се крие отговорът.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Използване на NVL за множество колони - Oracle SQL

  2. Как да четем и съхраняваме XML данни в база данни

  3. Условие за присъединяване към Oracle с Топ 1

  4. Следваща нула

  5. Опитвам се да разбера максималната дължина на Rowid в Oracle