騰訊雲TDSQL MySQL版 - 開發指南 分散式事務

騰訊雲資料庫發表於2021-08-27

由於事務操作的資料通常跨多個物理節點,在分散式資料庫中,類似方案即稱為分散式事務。
TDSQL MySQL版 支援普通分散式事務協議和 XA 分散式事務協議。TDSQL MySQL版(核心5.7或以上版本)預設支援分散式事務,且對客戶端透明,像使用單機事務一樣方便。
TDSQL MySQL版 分散式事務採用兩階段提交演算法(2PC)保證事務的原子性(Atomicity)和一致性(Consistency),隔離級別配置為 Read committed、Repeatable read 或 Serializable。

普通分散式事務
begin; # 開啟事務
... # 跨 set 的增刪改查等非 DDL 操作
commit; # 提交事務
XA 分散式事務
XA 分散式事務是指跨例項的事務:

xa begin ''; # 開啟 XA 事務,事務標識由系統內部生成,因此傳入空字串
... # 跨 set 的增刪改查等非 DDL 操作
select gtid(); # 獲取當前 XA 事務的標識,下面假定為'xid'
xa prepare 'xid'; # 準備事務
xa commit/rollback 'xid'; # 提交或回滾事務
新增事務介面
select gtid() :獲取當前分散式事務的全域性唯一標識。如果為空,則該事務不是分散式事務。

普通分散式事務標識的格式為:‘閘道器id’-‘proxy隨機值’-‘序列號’-‘時間戳’-‘分割槽號’,例如 c46535fe-b6-dd-595db6b8-25。
XA 分散式事務標識的格式為:‘ex’-‘閘道器id’-‘proxy隨機值’-‘序列號’-‘時間戳’-‘分割槽號’,例如 ex-c46535fe-b6-dd-595db6b8-25。
select gtid_state(“當前分散式事務的全域性唯一標識”):在事務提交異常之後(預設3秒後)用來獲取事務的狀態。可能的結果有:

COMMIT:標識該事務已經或者最終會被提交。
ABORT:標識該事務最終會被回滾。
空:由於事務的狀態會在一個小時之後清除,因此有以下兩種可能:
一個小時之後查詢,標識事務狀態已經清除,
一個小時以內查詢,標識事務最終會被回滾。
xa boost ‘當前分散式事務的全域性唯一標識’:普通事務提交(commit)傳送異常之後,事務在一段時間內(預設30秒)由後臺元件自動提交或者回滾掉。如果使用者不願意等待這麼長的時間,可以反覆呼叫該介面,促使系統及時地提交或回滾掉事務。該介面會返回事務的狀態,即提交或者回滾。

xa lockwait:顯示當前分散式事務的等待關係。使用者可以通過 dot 工具,將其轉化為圖片。

xa show:顯示當前 proxy 上處於活躍狀態的事務。

相關文章