MySQl事務建立,開始以及提交

aoerqileng發表於2022-06-02

建立事務

trx_allocate_for_mysql中呼叫trx_create 進行建立

方法中分配一個記憶體物件,然後初始化這個物件的值,可以看到trx->id = ut_dulint_zero;

在建立的時候是設定了0,

建立undo_mutex


事務的提交

trx_commit_for_mysql

    trx->op_info = "committing";

    trx_start_if_not_started(trx);

    mutex_enter(&kernel_mutex);

    trx_commit_off_kernel(trx);

    mutex_exit(&kernel_mutex);


開始一個事務

trx_start_low

    if (rseg_id == ULINT_UNDEFINED) {

        // 分配roll segment

        rseg_id = trx_assign_rseg();

    }

    // 事務系統包含一個陣列,有對應的roll segment,大小256,一個事務有256個roll segment,rseg_id 是上面分配的,

系統最多也只能有256個回滾段

    rseg = trx_sys_get_nth_rseg(trx_sys, rseg_id);

    //事務開始時就分配事務ID

    trx->id = trx_sys_get_new_trx_id();

    /* The initial value for trx->no: ut_dulint_max is used in

    read_view_open_now: */

    trx->no = ut_dulint_max;

    trx->rseg = rseg;

    trx->conc_state = TRX_ACTIVE;

    trx->start_time = time(NULL);

    UT_LIST_ADD_FIRST(trx_list, trx_sys->trx_list, trx);

    return(TRUE);

}

回滾段的分配trx_assign_rseg

回滾段也是使用列表進行管理,會跳過系統回滾段


事務的提交

trx_commit_off_kernel

針對insert update 的undo 做了區分,在事務提交的時候,會修改undo的狀態

事務提交的程式碼很好的描述了mtr的作用,文件中的描述是確保在檔案層面確保事務的完整性。

因為這個事務涉及到了undo檔案和binlog 檔案


關於update的undo 清理

trx_purge_add_update_undo_to_history

將undo的加入到history list,然後清理undo段

insert的操作涉及到可見性的問題,insert的undo是設定成free狀態,undo 是purge,insert的undo並沒有放入到history list 中,


insert的undo和update的undo為何區分開來處理?

create table為什麼放到事務中處理?


有興趣學習原始碼的加群一起學習啊 QQ:  700072075


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25719946/viewspace-2898623/,如需轉載,請註明出處,否則將追究法律責任。

相關文章