久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

MySQL中應用無感知設計的示例分析

248次閱讀
沒有評論

共計 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 行業資訊頻道!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-04發表,共計5922字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 屏东县| 东方市| 济南市| 临颍县| 襄樊市| 深圳市| 宽甸| 台安县| 辽源市| 阿拉善盟| 伊通| 罗山县| 台南县| 阳山县| 沙湾县| 思南县| 白山市| 东山县| 雷山县| 博湖县| 天台县| 莱西市| 漳平市| 义乌市| 于都县| 瑞安市| 南汇区| 襄垣县| 东平县| 阜南县| 缙云县| 姜堰市| 廊坊市| 报价| 望谟县| 荆州市| 永嘉县| 资阳市| 兴国县| 武山县| 宜兰县|