1. 簡介
大家都知道,在數據庫中間件讀寫分離應用場景中,如何保證底層數據庫出現故障節點的時,中間件可以快速斷開或遷移數據庫連接,讓用戶無感知。
在MySQL數據庫中,提供了一個session_track_transaction_info參數來提供解決方案。
因為官方文檔上沒有對該參數的說明,本文專門介紹該參數的可選值并驗證了實際的影響。下面話不多說了,來隨著小編一起看看詳細的介紹吧
2. session_track_transaction_info參數
2.1 參數介紹
MySQL5.7中,可以通過設置session_track_transaction_info變量來跟蹤事務的狀態。
該參數存在global以及session兩個級別,可以動態修改。 該參數可以設置的值為0(默認OFF),1,2| /** Transaction tracking level*/enum enum_session_track_transaction_info { TX_TRACK_NONE = 0, ///< do not send tracker items on transaction info TX_TRACK_STATE = 1, ///< track transaction status TX_TRACK_CHISTICS = 2 ///< track status and characteristics}; |
該參數允許設置的值為0,1,2
設置為0的時候,show variables like '%session_track_transaction_info%'顯示為OFF,表示不開啟事務狀態跟蹤 設置為1的時候,show variables like '%session_track_transaction_info%'顯示為STATE,表示跟蹤事務狀態 設置為2的時候,show variables like '%session_track_transaction_info%'顯示為CHARACTERISTICS,表示跟蹤事務狀態和語句2.2 參數設置影響
開啟session_track_transaction_info參數的時候,在數據庫中無法直接查詢到事務狀態記錄。
根據[WL#4797],MySQL是將事務狀態跟蹤的信息記錄到了每一個Query請求返回的OK packet中。
可以通過抓包的方式查看事務狀態信息。
2.2.1 原生MySQL OK packet格式
OK Packet的數據包格式定義
| 類型 | 名字 | 描述 |
|---|---|---|
| int<1> | 頭部 | 用0x00或者0xFE表示該數據包是一個OK Packet |
| int | 影響的行數 | 影響的行數 |
| int | 上次插入的id | 上次插入的id |
| int<2> | 狀態標識 | 如果定義了CLIENT_PROTOCOL_41,會有這一部分 |
| int<2> | 警告數量 | 警告的數量,如果定義了CLIENT_PROTOCOL_41,會有這一部分 |
| int<2> | 狀態標識 | 如果定義了CLIENT_TRANSACTIONS,會有這一部分 |
| string | 信息 | 人類可讀的狀態信息,如果定義了CLIENT_SESSION_TRACK,會有這一部分 |
| string | 會話狀態 | 會話狀態信息,如果定義了SERVER_SESSION_STATE_CHANGED,會有這一部分 |
| string | 信息 | 人類可讀的信息 |
新聞熱點
疑難解答