共計 5922 個字符,預計需要花費 15 分鐘才能閱讀完成。
這篇文章主要介紹 MySQL 中應用無感知設計的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
session_track_transaction_info 參數
參數介紹
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,表示跟蹤事務狀態和語句
參數設置影響
開啟 session_track_transaction_info 參數的時候,在數據庫中無法直接查詢到事務狀態記錄。
根據 [WL#4797],MySQL 是將事務狀態跟蹤的信息記錄到了每一個 Query 請求返回的 OK packet 中。
可以通過抓包的方式查看事務狀態信息。
原生 MySQL OK packet 格式
OK Packet 的數據包格式定義
類型名字描述 int 1 頭部用 0x00 或者 0xFE 表示該數據包是一個 OK Packetint 影響的行數影響的行數 int 上次插入的 id 上次插入的 idint 2 狀態標識如果定義了 CLIENT_PROTOCOL_41, 會有這一部分 int 2 警告數量警告的數量,如果定義了 CLIENT_PROTOCOL_41, 會有這一部分 int 2 狀態標識如果定義了 CLIENT_TRANSACTIONS, 會有這一部分 string 信息人類可讀的狀態信息,如果定義了 CLIENT_SESSION_TRACK,會有這一部分 string 會話狀態會話狀態信息,如果定義了 SERVER_SESSION_STATE_CHANGED, 會有這一部分 string 信息人類可讀的信息
其中 int lenenc 和 string lenenc 中的 lenenc 表示的是 LengthEcode。
MySQL-5.7.19 代碼中封裝 OK packet 的代碼部分在 protocol_classic.cc 文件中的 net_send_ok() 函數中。
session_track_transaction_info 額外補充信息
session_track_transaction_info 使用 8 個字符位來表示事務的信息,并且這 8 個字符信息是保存在 COM_QUERY 請求語句的返回數據包中的(客戶端執行一條語句,都會被封裝成 MySQL 協議中的 COM_QUERY 請求發送給 server 端,server 端解析執行之后將結果封裝在數據包中返回)。
位置表示信息具體代表含義 Place 1TransactionT 顯式的開啟一個事務
I 隱式的開啟一個事務(@autocommit=0)
_ 沒有活躍的事務 Place 2unsafe readr 當前事務中讀取了非事務性存儲引擎的表
_ 當前事務中沒有讀取非事務性存儲引擎的表 Place 3transaction readR 當前事務中讀取了事務性存儲引擎的表
_ 當前事務中沒有讀取事務性存儲引擎的表 Place 4unsafe wirtew 當前事務中寫入了非事務性存儲引擎的表
_ 當前事務中沒有寫入非事務性存儲引擎的表 Place 5transaction writeW 當前事務中寫入了事務性存儲引擎的表
_ 當前事務中沒有寫入事務性存儲引擎的表 Place 6unsafe statements 當前事務中使用了不安全的語句,類似于 UUID()
_ 沒有使用類似的不安全的語句 Place 7result-setS 發送給了客戶端一個結果集
_ 沒有結果集 Place 8LOCKed TABLESL 表被顯式的通過 LOCK TABLES 語句上鎖了
_ 當前事務中沒有鎖表
session_track_transaction_info = 0 時 OK packet 格式解析
session_track_transaction_info= 0 表示不記錄事務信息,所有在 server 端返回的數據包中沒有事務狀態跟蹤信息。
## session_track_transaction_info = 0
客戶端執行 begin;封裝的數據包
06 00 00 # playload_length
00 # sequence_id
03 # command_type COM_QUERY
62 65 67 69 6e # begin
server 端返回的數據包:response
07 00 00 # playload_length
01 # sequence_id
00 # 頭部 0x00 表示是一個 OK 包
00 # 影響的行數 0
00 # 上次插入的 id
03000000
客戶端執行 insert into t1 values(55) 封裝的數據包
1a 00 00 # playload_length
00 # sequence_id
03 # command_type COM_QUERY
696e7365727420696e746f2074312076616c75657328353529 # insert into t1 values(55)
server 端返回的數據包:response
07 00 00 # playload_length
01 # sequence_id
00010003000000
客戶端執行 commit;封裝的數據包
07 00 00 # playload_length
00 # sequence_id
03 # command_type COM_QUERY
636f6d6d6974 # commit
server 端返回的數據庫包:response
07 00 00 # playload_length
01 # sequence_id
00000002000000
session_track_transaction_info = 1 時 OK packet 格式解析
## session_track_transaction_info = 1
客戶端執行 begin;封裝的數據包
06 00 00 # playload_length
00 # sequence_id
03 # command_type COM_QUERY
626567696e # begin
server 端返回的數據包:response
14 00 00 # playload_length
01 # sequence_id
00 # 頭部 0x00 表示是一個 OK 包
00 # 影響的行數 0
00 # 上次插入的 id
03400000000b050908
54 5f 5f 5f 5f 5f 5f 5f
# 事務狀態信息 T_______
# Place 1: 54 // 顯式的開啟一個事務
# Place 2: 5f // 當前事務中沒有讀取非事務性存儲引擎的表
# Place 3: 5f // 當前事務中沒有讀取事務性存儲引擎的表
# Place 4: 5f // 當前事務中沒有寫入非事務性存儲引擎的表
# Place 5: 5f // 當前事務中沒有寫入事務性存儲引擎的表
# Place 6: 5f // 當前事務中沒有使用不安全的語句
# Place 7: 5f // 沒有結果集
# Place 8: 5f // 沒有鎖表
客戶端執行 insert into t1 values(111) 封裝的數據包
1b 00 00 # playload_length
00 # sequence_id
03 # command_type COM_QUERY
696e7365727420696e746f2074312076616c7565732831313129 # insert into t1 values(111)
server 端返回的數據包:response
14 00 00 # playload_length
01 # sequence_id
00010003400000000b050908
54 5f 5f 5f 57 5f 5f 5f # 事務狀態信息 T___W___
# Place 1: 54 // 顯式的開啟一個事務
# Place 2: 5f // 當前事務中沒有讀取非事務性存儲引擎的表
# Place 3: 5f // 當前事務中沒有讀取事務性存儲引擎的表
# Place 4: 5f // 當前事務中沒有寫入非事務性存儲引擎的表
# Place 5: 57 // 當前事務中有寫入事務性存儲引擎的表
# Place 6: 5f // 當前事務中沒有使用不安全的語句
# Place 7: 5f // 沒有結果集
# Place 8: 5f // 沒有鎖表
客戶端執行 commit;封裝的數據包
07 00 00 # playload_length
00 # sequence_id
03 # command_type COM_QUERY
636f6d6d6974 # commit
server 端返回的數據包:response
1400000100000002400000000b050908
5f 5f 5f 5f 5f 5f 5f 5f # 事務狀態信息________
# Place 1: 5f // 沒有活躍的事務
# Place 2: 5f // 當前事務中沒有讀取非事務性存儲引擎的表
# Place 3: 5f // 當前事務中沒有讀取事務性存儲引擎的表
# Place 4: 5f // 當前事務中沒有寫入非事務性存儲引擎的表
# Place 5: 5f // 當前事務中沒有寫入事務性存儲引擎的表
# Place 6: 5f // 當前事務中沒有使用不安全的語句
# Place 7: 5f // 沒有結果集
# Place 8: 5f // 沒有鎖表
session_track_transaction_info = 2 時 OK packet 格式解析
將 session_track_transaction_info 參數設置為 2 的時候,會顯示更加詳細的事務狀態信息。
客戶端執行 begin;封裝的數據包
06 00 00 # playload_length
00 # sequence_id
03 # command_type COM_QUERY
626567696e # begin
server 端返回的數據包:response
29 00 00 # playload_length
01 # sequence_id
000000034000000020050908
54 5f 5f 5f 5f 5f 5f 5f # 事務狀態信息 T_______
0413125354415254205452414e53414354494f4e3b # START TRANSACTION;
# Place 1: 54 // 顯式的開啟一個事務
# Place 2: 5f // 當前事務中沒有讀取非事務性存儲引擎的表
# Place 3: 5f // 當前事務中沒有讀取事務性存儲引擎的表
# Place 4: 5f // 當前事務中沒有寫入非事務性存儲引擎的表
# Place 5: 5f // 當前事務中沒有寫入事務性存儲引擎的表
# Place 6: 5f // 當前事務中沒有使用不安全的語句
# Place 7: 5f // 沒有結果集
# Place 8: 5f // 沒有鎖表
客戶端執行 insert into t1 values(222) 封裝的數據包
1b 00 00 # playload_length
00 # sequence_id
03 # command_type COM_QUERY
696e7365727420696e746f2074312076616c7565732832323229 # insert into t1 values(222)
server 端返回的數據包:response
14 00 00 # playload_length
01 # sequence_id
00010003400000000b050908
54 5f 5f 5f 57 5f 5f 5f # 事務狀態信息 T___W___
# Place 1: 5f // 沒有活躍的事務
# Place 2: 5f // 當前事務中沒有讀取非事務性存儲引擎的表
# Place 3: 5f // 當前事務中沒有讀取事務性存儲引擎的表
# Place 4: 5f // 當前事務中沒有寫入非事務性存儲引擎的表
# Place 5: 5f // 當前事務中沒有寫入事務性存儲引擎的表
# Place 6: 5f // 當前事務中沒有使用不安全的語句
# Place 7: 5f // 沒有結果集
# Place 8: 5f // 沒有鎖表
00000002400000000e050908
5f 5f 5f 5f 5f 5f 5f 5f # 事務狀態信息 ________
040100
# Place 1: 5f // 沒有活躍的事務
# Place 2: 5f // 當前事務中沒有讀取非事務性存儲引擎的表
# Place 3: 5f // 當前事務中沒有讀取事務性存儲引擎的表
# Place 4: 5f // 當前事務中沒有寫入非事務性存儲引擎的表
# Place 5: 5f // 當前事務中沒有寫入事務性存儲引擎的表
# Place 6: 5f // 當前事務中沒有使用不安全的語句
# Place 7: 5f // 沒有結果集
# Place 8: 5f // 沒有鎖表
以上是“MySQL 中應用無感知設計的示例分析”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注丸趣 TV 行業資訊頻道!