MySQL事務兩段式提交

風塵_NULL發表於2020-07-06

⒈兩段式提交的目的:解決參與者(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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章