MySQL事務兩段式提交
⒈兩段式提交的目的:解決參與者(redo log & binlog)的一致性
⒉兩段式提交的原理:實際是防止參與方(資源管理者)部分提交(在binlog 與 redo log中,如果提交前redo log準備好,而binlog沒準備好,直接提交,則binlog可能寫失敗;如果binlog準備,redo log沒準備好,就會導致提交丟失)
⒊兩段式提交的兩個階段:
第一階段:為prepare階段,TM(事務管理器)向RM(資源管理器)發出prepare指令,RM進行操作,然後返回成功與否的資訊給TM;
第二階段:為事務提交或者回滾階段,如果TM收到所有RM的成功訊息,則TM向RM發出提交指令;不然則發出回滾指令
⒋Binlog/Redo XA在MySQL版本的演變:
⑴5.5版本:
①第一階段(innodb prepare)
持有prepare_commit_mutex
將undo狀態改為prepare狀態
將redo write/fsync回磁碟
binlog不做任何操作
②第二階段(commit)
write/sync_binlog
innodb_commit(寫入COMMIT標誌後,釋放prepare_commit_mutex互斥量)
這裡有一個併發的缺陷就是prepare_commit_mutex這個互斥量,貫穿提交兩階段
⑵5.6版本:
①第一階段(innodb prepare)
持有prepare_commit_mutex
將undo狀態改為prepare狀態
將redo write/fsync回磁碟
binlog不做任何操作
釋放prepare_commit_mutex
②第二階段(commit)
分為三個佇列,分為三個小階段(每一個階段是一個佇列,進入每個佇列都有一個互斥量保護,有leader事物領導操作)
flush階段:leader將一組事物的binlog 寫入IOcache
sync階段:將binlog sync磁碟
commit階段:根據引數binlog_order_commits的設定,進行提交
分為三階段的優勢是:拆分了之前的mutex,增加了併發性
但是redo log仍然是不能組提交
⑶5.7版本:
①第一階段(innodb prepare)
持有prepare_commit_mutex
將undo狀態改為prepare狀態
將lsn記錄到thd資料結構的lsn
binlog不做任何操作(這裡如果是開啟了GTID,就獲取lock_interval的起始邏輯時鐘,用於MTS的重放)
釋放prepare_commit_mutex
②第二階段(提交階段)
分為三個佇列,分為三個小階段(每一個階段是一個佇列,進入每個佇列都有一個互斥量保護,由leader事物執行緒領導操作)
⑴flush stage階段:
leader事物執行緒蒐集flush佇列,找出最大的LSN,然後將redo log write/flush磁碟到這個最大的LSN
write binlog,將binlog寫入IO快取
⑵sync階段:
將binlog刷入磁碟
⑶commit階段:
根據引數binlog_order_commits的設定,進行提交
優勢:將歷史redo在prepare階段的write/sync改到了flush state,這樣就能進行redo的組提交
⒌Binlog/Redo XA在引數的調整:
flush階段:
binlog_max_flush_queue_time:5.7.9之前的版本可用,flush佇列等待的時間
sync階段:
binlog_group_commit_sync_delay:在進入sync階段所等待的時間
binlog_group_commit_sync_no_delay_count:binlog_group_commit_sync_delay毫秒直到收集到binlog_group_commit_sync_no_delay_count個事務時,進行一次組提交;
commit階段:
binlog_order_commits:控制binlog是否按照順序提交
⒍參考:
https://blog.csdn.net/n88Lpo/article/details/81187372
https://www.cnblogs.com/cchust/p/4439107.html
https://www.cnblogs.com/bush2582/p/11338455.html
https://www.cnblogs.com/yuyue2014/p/4738007.html
https://www.cnblogs.com/exceptioneye/p/5451960.html
https://www.cnblogs.com/andy6/p/9850855.html
%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30221425/viewspace-2702646/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- PHP分散式事務-兩段式提交 2PC(二)PHP分散式
- vitess兩階段提交事務Vite
- MySQl事務建立,開始以及提交MySql
- 分散式事務(二)之兩階段提交分散式
- 分散式:分散式事務(CAP、兩階段提交、三階段提交)分散式
- MySQL:begin後事務為什麼不提交MySql
- MySQL實現事務的提交和回滾MySql
- mysql兩階段提交和組提交MySql
- [Mysql]兩階段提交MySql
- mysql隱式提交事務transaction一點筆記MySql筆記
- MySQL事務提交的三個階段介紹MySql
- 分散式事務--兩階段提交(2PC-Prepare/Commit)分散式MIT
- 十五:MySQL層事務提交流程簡析(筆記)MySql筆記
- 第15節:MySQL層事務提交流程簡析MySql
- 分散式事務處理兩階段提交機制和原理分散式
- 事務單獨提交和
- 一文帶你深度解析MySQL 8.0事務提交原理MySql
- MySQL事務還沒提交,Canal就能讀到訊息了?MySql
- 分散式事務對於兩階段提交的錯誤處理分散式
- SharePlex qview工具 vs OGG logdump工具探究兩個複製工具事務開始 or 事務提交複製?View
- Spring中的事務提交事件Spring事件
- 分散式事務的兩階段提交和三階段提交分別有什麼優缺點?分散式
- MySQL 事務MySql
- mysql事務MySql
- MySQL事務(一)認識事務MySql
- MySQL 核心模組揭秘 | 06 期 | 事務提交之前,binlog 寫到哪裡?MySql
- 簡單介紹MySQL開啟事務的兩種方式MySql
- MySQL兩階段提交過程原理簡述MySql
- MySQL 事務操作MySql
- MySQL--->事務MySql
- MySQL 三 事務MySql
- MySQL--事務MySql
- MySQL索引事務MySql索引
- MySQL-事務MySql
- @Transactional註解管理事務和手動提交事務
- 分散式事務(二)之三階段提交分散式
- MySQL 事務日誌MySql
- mysql基礎_事務MySql