Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Tại sao tôi nhận được một giao dịch đang mở khi chỉ chọn từ Chế độ xem cơ sở dữ liệu?

Trái với mong đợi của bạn, có vẻ như liên kết cơ sở dữ liệu nguồn của giao dịch mở. Tôi đã nhận thấy hành vi như thế này trước đây khi chạy truy vấn CHỌN trên các bảng từ xa trong PL / SQL Developer.

Để trích dẫn Tom Kyte ( nguồn ):

CHỈNH SỬA :'Bất kỳ câu lệnh SQL nào bắt đầu một giao dịch trong Oracle'? Không, không, và đây là một minh chứng về điều đó. Trình diễn này sử dụng chế độ xem từ điển dữ liệu V $ TRANSACTION , liệt kê các giao dịch đang hoạt động. Tất cả đều đang chạy trên cơ sở dữ liệu Oracle XE cục bộ của tôi, không có người dùng nào khác ngoài tôi kết nối với nó.

Chúng tôi sẽ sử dụng bảng sau trong cuộc trình diễn này. Nó chỉ chứa một cột duy nhất:

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

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

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

Không có giao dịch đang hoạt động tại thời điểm này. Hãy chạy một truy vấn SQL đối với bảng này:

SQL> select * from test;

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

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

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

Vẫn không có giao dịch hoạt động. Bây giờ chúng ta hãy làm điều gì đó sẽ bắt đầu một giao dịch:

SQL> insert into test values (1);

1 row created.

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

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

Như dự kiến, chúng tôi hiện có một giao dịch đang hoạt động.

SQL> commit;

Commit complete.

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

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

Sau khi thực hiện giao dịch, giao dịch đó không còn hoạt động nữa.

Bây giờ, hãy tạo một liên kết cơ sở dữ liệu. Tôi đang sử dụng Oracle XE và phần sau tạo liên kết cơ sở dữ liệu từ phiên bản Oracle XE của tôi trở lại chính nó:

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

Database link created.

Bây giờ, hãy xem điều gì sẽ xảy ra khi chúng ta chọn từ bảng qua liên kết cơ sở dữ liệu:

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

Như bạn có thể thấy, chỉ cần chọn từ một bảng từ xa sẽ mở ra một giao dịch.

Tôi không chắc chắn chính xác những gì có thể cam kết hoặc khôi phục ở đây, nhưng tôi phải thừa nhận rằng không biết nội dung và kết quả của các giao dịch phân tán, câu trả lời có thể nằm trong đó.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thay thế Find_in_set của mysql trong Oracle là gì

  2. Oracle ORA-30004 khi sử dụng hàm SYS_CONNECT_BY_PATH,

  3. Cách kết nối oracle Cloud Instance bằng Oracle Cloud Shell?

  4. ĐẶT SQLBLANKLINES:Cách Cho phép Dòng trống trong SQLcl &SQL * Plus

  5. Ứng dụng khách máy tính để bàn miễn phí cho Oracle?