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, 然後清理事務對應的資源。