Oracle database link中查詢會開啟事務嗎?

来源:https://www.cnblogs.com/kerrycode/archive/2018/12/20/10148050.html
-Advertisement-
Play Games

關於oracle database link,使用database link相關的查詢語句是否會開啟事務呢?我們知道,在資料庫中一個簡單的SELECT查詢語句不會產生事務(select for update會產生事務)。如下測試所示: 我們首先準備測試環境,創建了一個database link: L... ...


關於oracle database link,使用database link相關的查詢語句是否會開啟事務呢?我們知道,在資料庫中一個簡單的SELECT查詢語句不會產生事務(select for update會產生事務)。如下測試所示:

 

 

clip_image001

 

我們首先準備測試環境,創建了一個database link: LINK_NODEFINE_TEST,然後我們開始測試

 

CREATE PUBLIC DATABASE LINK LINK_NODEFINE_TEST
CONNECT TO TEST IDENTIFIED BY "t123$%^" 
USING '(DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.20.57.24)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = gsp.localdomain)
    )
  )';

 

 

下麵開始演示一下database link相關的查詢是否會開啟事務:

 

SQL> show user;
USER is "SYS"
SQL> select userenv('sid') from dual;
 
USERENV('SID')
--------------
           939
 
SQL> select xidusn, xidslot, xidsqn  
  2  from v$transaction, v$session  
  3  where saddr=ses_addr;
 
no rows selected
 
SQL> select * from kerry@link_nodefine_test;
 
        ID NAME
---------- --------------------------------
       100 kerry
 
SQL> select xidusn, xidslot, xidsqn  
  2  from v$transaction, v$session  
  3  where saddr=ses_addr;
 
    XIDUSN    XIDSLOT     XIDSQN
---------- ---------- ----------
         3         14    4122050
 
SQL> alter session close database link link_nodefine_test;
ERROR:
ORA-02080: database link is in use
 
 
SQL> commit; --必須要先commit,才能關閉鏈接
 
Commit complete.
 
SQL> alter session close database link link_nodefine_test;
 
Session altered.

 

下麵我們創建一個賬號TEST,測試驗證database link所指向遠程資料庫中會話的生存周期,簡單測試,你會發現即使一個簡單查詢(包含database link),會在遠程資料庫生成一個會話。而且如果不執行alter session close database link xxx關閉對應的database link的話,該會話不會銷毀,而是變成INACTVIE狀態。直到其觸發了TCP keepalive相關機制後才會被資料庫清理。

 

clip_image002

 

 

一旦你執行了database link相關的查詢,  那麼在遠程資料庫(10.20.57.24)這個測試伺服器的資料庫實例中,就會生成對應的會話,而且只有在原資料庫執行了alter session close database link link_nodefine_test"後,對應的會話才會銷毀(當然,觸發了TCP keepalive相關機制後也會被資料庫清理)。有興趣可以自行測試。

 

SQL> select count(*) from v$session where username='TEST';
 
  COUNT(*)
----------
         1
 
SQL> select count(*) from v$session where username='TEST';
 
  COUNT(*)
----------
         0
 
SQL> 

 

那麼問題來了,如果我在會話當中多次使用select * from kerry@link_nodefine_test這類包含database link的語句,是否會在10.20.57.24生成多個會話呢? 還是說這個database link相關的會話會復用呢? 下麵我們測試驗證一下:

 

如下所示,同一個會話當中多次使用database link查詢,不會在10.20.57.24生成多個會話。 但是如果多個不同會話中都使用database link link_nodefine_test的話,那麼就會在(10.20.57.24)中生成多個會話

 

 

clip_image003

 

 

那麼如果在同一個會話中,使用不同的database link,但是這兩個database link使用相同的賬號,指向相同的伺服器,那麼這個是否也共用一個會話呢?答案是不會,而是會生成新的會話。如下測試所示

 

CREATE PUBLIC DATABASE LINK LINK_DEDIATED_TEST
CONNECT TO TEST IDENTIFIED BY "t123$%^" 
USING '(DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.20.57.24)(PORT = 1521))
    )
    (CONNECT_DATA =
       (SERVER = DEDICATED)
      (SERVICE_NAME = gsp.localdomain)
    )
  )';

 

 

clip_image004

 

關於dblink的查詢為什麼產生事務的原理分析,參考官方文檔Transaction Processing in a Distributed System

 

 

Two-Phase Commit Mechanism

 

A database must guarantee that all statements in a transaction, distributed or non-distributed, either commit or roll back as a unit. The effects of an ongoing transaction should be invisible to all other transactions at all nodes; this transparency should be true for transactions that include any type of operation, including queries, updates, or remote procedure calls.

 

The general mechanisms of transaction control in a non-distributed database are discussed in the Oracle Database Concepts. In a distributed database, the database must coordinate transaction control with the same characteristics over a network and maintain data consistency, even if a network or system failure occurs.

The database two-phase commit mechanism guarantees that all database servers participating in a distributed transaction either all commit or all roll back the statements in the transaction. A two-phase commit mechanism also protects implicit DML operations performed by integrity constraints, remot

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一. Sentinel 高可用環境準備 1.1 Sentinel 集群環境 1.2 Redis主庫庫環境,主從庫搭建在(redis 系列22 複製Replication 下) 二. Sentinel 配置說明 2.1 啟動Sentinel服務方法 對於啟動Sentinel服務有二種方法: (1)是使 ...
  • Call to localhost/127.0.0.1:9000 failed on connection exception:java.net.ConnectException的解決方案 作者:凱魯嘎吉 - 博客園 http://www.cnblogs.com/kailugaji/ 在啟動hado ...
  • ...
  • 數據表介紹 --1.學生表 Student(SId,Sname,Sage,Ssex) --SId 學生編號,Sname 學生姓名,Sage 出生年月,Ssex 學生性別 --2.課程表 Course(CId,Cname,TId) --CId 課程編號,Cname 課程名稱,TId 教師編號 --3. ...
  • [20181220]使用提示OR_EXPAND優化.txt--//鏈接http://www.itpub.net/thread-2107240-2-1.html,http://www.itpub.net/thread-2107231-2-1.html的討論.--//ZALBB建議在18c下嘗試看看,我 ...
  • 1,某條數據放首位,其他倒序並分頁 select * from Student order by( case when id='2' then 1 ELSE 4 END),id desc limit 0,5; 2,給查詢的每條記錄添加編號 select (@i:=@i+1) no , s.* fro ...
  • Ubuntu 12.04上安裝Hadoop並運行 作者:凱魯嘎吉 - 博客園 http://www.cnblogs.com/kailugaji/ 在官網上下載好四個文件 在Ubuntu的/home/wrr/下創建一個文件夾java,將這四個文件拷到Ubuntu的/home/wrr/java/下,將e ...
  • 本文由雲+社區發表 本文作者:孫旭,騰訊資料庫開發工程師,9年資料庫內核開發經驗;熟悉資料庫查詢處理,併發控制,日誌以及存儲系統;熟悉PostgreSQL(Greenplum,PGXC等)、Teradata等資料庫內核實現機制。 CynosDB 是騰訊資料庫研發團隊推出的自研資料庫,有Postgre ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...