日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國(guó)內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁(yè) > 數(shù)據(jù)庫(kù) > 數(shù)據(jù)庫(kù)應(yīng)用 > MySQL系列:innodb源碼分析之mini transaction

MySQL系列:innodb源碼分析之mini transaction

來(lái)源:程序員人生   發(fā)布時(shí)間:2014-12-23 08:25:11 閱讀次數(shù):5516次

    日志是innodb1個(gè)非常重要的模塊,在innodb中有兩類日志:redo log和undo log。其中redolog日志是用來(lái)做數(shù)據(jù)異常恢復(fù)和數(shù)據(jù)庫(kù)重啟時(shí)頁(yè)數(shù)據(jù)同步恢復(fù)的,redo log是建立在在mini transaction基礎(chǔ)上。數(shù)據(jù)庫(kù)在履行事務(wù)時(shí),通過(guò)minitransaction產(chǎn)生redo log來(lái)保證事務(wù)的持久性。

1.mini transaction3個(gè)協(xié)議

        mini-transcation是用來(lái)實(shí)現(xiàn)innodb的物理邏輯日志的寫(xiě)入和頁(yè)恢復(fù)的,通過(guò)mini-transcation來(lái)保證并發(fā)事務(wù)操作和數(shù)據(jù)庫(kù)異常是頁(yè)的1致性。為了得到頁(yè)的1致性,mini-transaction遵守以下3個(gè)協(xié)議:

        1. The FIX Rules

      2. Write-Ahead Log

      3. Force-log-at-commit

1.1The FIX Rules

    The FIX Rules規(guī)定以下:

              修改1個(gè)頁(yè)需要取得該頁(yè)的x-latch

              訪問(wèn)1個(gè)頁(yè)是需要取得該頁(yè)的s-latch或x-latch

              持有該頁(yè)的latch直到修改或訪問(wèn)該頁(yè)的操作完成

1.2Write-Ahead Log

       Write-Ahead Log的意思就是如果1個(gè)頁(yè)操作在寫(xiě)入到持久裝備時(shí),必須內(nèi)存中相對(duì)應(yīng)的日志寫(xiě)入到持久化裝備中。每一個(gè)頁(yè)有1個(gè)LSN,每次頁(yè)修改需要保護(hù)這個(gè)LSN,當(dāng)1個(gè)頁(yè)需要寫(xiě)入到持久化裝備時(shí),要求內(nèi)存中小于該頁(yè)LSN的日志先寫(xiě)入到持久化裝備中。日志寫(xiě)完后,先Fixed這個(gè)頁(yè)的latch,再將內(nèi)存中的頁(yè)刷盤(pán)。完成刷盤(pán)后,釋放頁(yè)latch。這里遵守The FIX Rules協(xié)議。

1.3 Force-log-at-commit

       1個(gè)事務(wù)可以同時(shí)修改了多個(gè)頁(yè),Write-AheadLog單個(gè)數(shù)據(jù)頁(yè)的1致性,沒(méi)法保證事務(wù)的持久性。Force -log-at-commit要求當(dāng)1個(gè)事務(wù)提交時(shí),其產(chǎn)生所有的mini-transaction日志必須刷到持久裝備中。這樣即便在頁(yè)數(shù)據(jù)刷盤(pán)的時(shí)候宕機(jī),也能夠通過(guò)日志進(jìn)行redo恢復(fù)。

2 mini-transaction的日志實(shí)現(xiàn)

       innodb是采取mini-transaction來(lái)構(gòu)建操作的物理邏輯日志的,在事務(wù)履行的時(shí)候,會(huì)通過(guò)mtr來(lái)保證頁(yè)的數(shù)據(jù)1致性和持久性。mini-transaction是通過(guò)1個(gè)mtr_t的結(jié)構(gòu)來(lái)實(shí)現(xiàn)mini-transaction的3個(gè)協(xié)議。mtr_t的定義以下:

typedef struct mtr_struct { ulint state; /*mtr的狀態(tài),MTR_ACTIVE、MTR_COMMITING、MTR_COMMITTED*/ dyn_array_t memo; /*正在持有的latch列表*/ dyn_array_t log; /*mtr產(chǎn)生的日志數(shù)據(jù)*/ ibool modifications; /*是不是修改了頁(yè)*/ ulint n_log_recs; /*log操作頁(yè)的個(gè)數(shù)*/ ulint log_mode; /*log操作模式,MTR_LOG_ALL、MTR_LOG_NONE、MTR_LOG_SHORT_INSERTS*/ dulint start_lsn; /*mtr起始的LSN*/ dulint end_lsn; /*mtr結(jié)束的LSN*/ ulint magic_n; /*魔法字*/ }mtr_t;

其中成員memo是個(gè)latch持有狀態(tài)的數(shù)組列表,采取的是dyn_array_t的動(dòng)態(tài)內(nèi)存結(jié)構(gòu)來(lái)保存的,每一個(gè)單元存儲(chǔ)的是mtr_memo_slot_t這樣的結(jié)構(gòu)。定義以下:
      

typedef struct mtr_memo_slot_struct { ulint type; /*latch的類型值*/ void* object; /*latch對(duì)象句柄,可以是rw_lock_t或buf_block_t*/ }mtr_memo_slot_t;

latch類型以下:
    MTR_MEMO_PAGE_S_FIX         /*rw_locks-latch*/
    MTR_MEMO_PAGE_X_FIX         /*rw_lockx-latch*/
    MTR_MEMO_BUF_FIX               /*buf_block_t*/
    MTR_MEMO_S_LOCK               /*rw_lock s-latch*/
    MTR_MEMO_X_LOCK               /*rw_lock x-latch*/

 

memo的latch管理接口
    mtr_memo_push                                       取得1個(gè)latch,并將狀態(tài)信息存入mtr memo當(dāng)中
    mtr_release_s_latch_at_savepoint       釋放memo偏移savepoint的slot鎖狀態(tài)
    mtr_memo_contains                          判斷鎖對(duì)象是不是在memo當(dāng)中
    mtr_memo_slot_release                    釋放slot鎖的控制權(quán)
    mtr_memo_pop_all                            釋放所有memo中的鎖的控制權(quán)

mt_t中的log成員是也是1個(gè)dyn_array_t動(dòng)態(tài)結(jié)構(gòu)的內(nèi)存,用來(lái)保存mtr產(chǎn)生的日志信息。日志的寫(xiě)入是通過(guò)mtr0log.h來(lái)寫(xiě)入的。這里指的1提的是日志格式,日志格式是有日志頭和日志體組成,日志頭信息是由type、space和page no組成,由mlog_write_initial_log_record_fast函數(shù)寫(xiě)入到mtr_t的log中的。以下是1個(gè)比較具體的示意圖:

      

log body的數(shù)據(jù)寫(xiě)入是通過(guò)mtr0log.h中的日志寫(xiě)入方法進(jìn)行寫(xiě)入的。每寫(xiě)入1跳操作日志,n_log_recs會(huì)加1.

標(biāo)識(shí)modifications是標(biāo)識(shí)是不是有page的數(shù)據(jù)改動(dòng),如果有,在mtr_commit調(diào)用時(shí)會(huì)先將mtr->log刷盤(pán),然后釋放mtr所有的所控制權(quán)。日志會(huì)1定會(huì)在mtr結(jié)束時(shí)刷盤(pán),這符合Force-log-at-commit的規(guī)定。日志寫(xiě)入調(diào)用的是log_write_low這個(gè)函數(shù)。

2.1 mtr_t的內(nèi)存結(jié)構(gòu)關(guān)系圖



3 總結(jié)

mini transaction是innodb對(duì)ACID中的持久性的最小保證單元,所有觸及到事務(wù)履行、頁(yè)數(shù)據(jù)刷盤(pán)、redo log數(shù)據(jù)恢復(fù)等都需要進(jìn)行mini transaction的構(gòu)造和履行。幾近所有的模塊都觸及到mini transaction,例如:btree、page、事務(wù)、inser tbuffer、redo-log等,d對(duì)mini transcaion的理解不能孤立的去看源代碼,應(yīng)當(dāng)結(jié)合redo log、page相干的代碼了解。它是理解innodb工作原理的基石。



 

 

 

 



生活不易,碼農(nóng)辛苦
如果您覺(jué)得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 亚洲一区二区三区在线 | 日韩1区2区| 精品2区| 国产精品一区二区av日韩在线 | 精品国产aⅴ麻豆 | 精品久久久久一区二区国产 | 波多野在线视频 | 成人毛片在线播放器 | 日韩欧美视频在线 | 午夜精品久久久久久久久 | 在线婷婷 | 1000部羞羞视频在线看视频 | 99久久久国产精品免费调教网站 | 久久亚洲国产精品 | 亚洲第一福利视频 | 久久精品国产亚洲一区二区三区 | 国内精品视频在线 | 日朝毛片 | 波多野结衣av在线播放 | 福利在线一区 | 精久久 | 69视频播放 | 在线观看1区 | 欧美福利在线观看 | 日韩 国产 欧美 精品 在线 | 亚洲精品一区国产精品 | 欧美a区 | 最新中文字幕在线观看 | 成人免费视频网址 | 国产激情一区二区三区在线观看 | 成人免费看片 | 狠狠干成人 | 一区二区三区在线观看国产 | 色94色欧美sute亚洲线路一久 | 国产视频久久 | 久久久国产精品视频 | av最新网站 | 717影视三级理论电影在线 | 国产一区视频在线 | 黄色网入口| 瑟瑟视频在线 |