WiredTiger的事務實現

WiredTiger對事務的支持, 是MongoDB支持事務的基礎, 這裏介紹一下WT下事務的實現過程。

transaction 相關的數據結構

__wt_txn_global

在WT_CONNECTION中, 有一個全局的事務相關的上下文結構體__wt_txn_global, 用來記錄事務實現的全局信息。 在open connection的時候調用__wt_txn_global_init來構建和初始化, 在關閉connection的時候調用__wt_txn_global_destroy,來清理資源。 主要包括:

  • 全局唯一的自增事務ID;
  • 最舊的未提交事務ID等;
  • checkpoint 相關信息;
  • named snapshot隊列信息;
  • 各個session對應state的數組;

__wt_txn

每一個session, 都有一個相關的上下文狀態的結構__wt_txn, 它用來產生事務結構體, 並且記錄了session的當前正在執行的transaction的相關信息。主要包括:

  • 事務的ID;
  • snapshot 數組;
  • WT_TXN_OP 修改數組;
  • log record日誌記錄;
  • checkpoint的狀態信息;
  • transaction的類型狀態信息;

__wt_txn_state

Per-session的transaction狀態信息。

事務的執行過程

通常事務的執行過程如下:
begin_transaction
wt_txn_op
commit_tranaction or rollback_tranaction

__wt_txn_begin

通過__wt_txn_begin調用__wt_txn_get_snapshot, 來產生一個新的事務。其實, 產生一個snapshot的過程很簡單, 就是在__wt_txn_global->stats, 將某個session->id指定爲當前的__wt_txn_state, 更新裏面的字段, 當我們需要某個transaction的時候, 通過TXN的ID可以找到相關的snapshot的ID。

__wt_txn_commit

當事務需要提交的時候, 需要根據配置設定事務的日誌提交方式, 然後通過__wt_txn_log_commit寫入日誌。 如果寫入成功, 就釋放掉該事務對應的修改操作txn->mod, 並且將事務清除; 如果失敗, 就調用__wt_txn_rollback rollback處理。

__wt_txn_rollback

一旦需要rollback, 需要將txn->mod的所有需改, 狀態變成WT_TXN_ABORTED, 然後清理事務對應的資源。

4.0以後的支持

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章