国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

MySQL 核心模塊揭秘,你看明白了嗎?

數據庫 MySQL
為了提升分配 undo 段的效率,事務提交過程中,InnoDB 會緩存一些 undo 段。只要同時滿足兩個條件,insert undo 段或 update undo 段就能被緩存。

1. 關于緩存 undo 段

為了提升分配 undo 段的效率,事務提交過程中,InnoDB 會緩存一些 undo 段。

只要同時滿足兩個條件,insert undo 段或 update undo 段就能被緩存。

條件 1:undo 段中只有一個 undo 頁。

條件 2:這個唯一的 undo 頁中,已經使用的的空間必須小于數據頁大小的四分之三。以默認大小 16K 的 undo 頁為例,undo 頁中已經使用的空間必須小于 12K。

如果 insert undo 段滿足緩存條件,它會加入回滾段的 insert_undo_cached 鏈表頭部。

如果 update undo 段滿足緩存條件,它會加入回滾段的 update_undo_cached 鏈表頭部。

2. InnoDB 提交事務

二階段提交過程中,commit 階段的 flush 子階段,把 prepare 階段及之前產生的 redo 日志都刷盤了,把事務執行過程中產生的 binlog 日志都寫入 binlog 日志文件了。

sync 子階段根據系統變量 sync_binlog 的值決定是否觸發操作系統把 binlog 日志刷盤。

前兩個子階段,都只處理了日志,不涉及 InnoDB 的事務。這兩個階段完成之后,InnoDB 的事務還沒有提交,事務還處于準備提交狀態(TRX_STATE_PREPARED)。

commit 子階段才會真正提交 InnoDB 的事務,這個階段完成之后,事務就提交完成了。

commit 子階段提交 InnoDB 的事務,要做的事情有這些:

  • 修改 insert undo 段的狀態。
  • 生成事務提交號,用于 purge 線程判斷是否能清理某些 update undo 日志組中的 undo 日志。
  • 修改 update undo 段的狀態。
  • 把 update undo 段中的 undo 日志組加入回滾段的 history list 鏈表。purge 線程會從這個鏈表中獲取需要清理的 update undo 日志組。
  • 把事務狀態修改為 TRX_STATE_COMMITTED_IN_MEMORY。
  • 釋放事務執行過程中 InnoDB 給表或記錄加的鎖。
  • 重新初始化事務對象,以備當前線程后續使用。

2.1 修改 insert undo 段狀態

如果事務插入記錄到用戶普通表,InnoDB 會為事務分配一個 insert undo 段。

如果事務插入記錄到用戶臨時表,InnoDB 會為事務分配另一個 insert undo 段。

InnoDB 可能會給事務分配 0 ~ 2 個 insert undo 段。commit 子階段會修分配給事務的所有 insert undo 段的狀態。

如果 insert undo 段滿足緩存條件,它的狀態會被修改為 TRX_UNDO_CACHED,否則,它的狀態會被修改為 TRX_UNDO_TO_FREE。

事務提交完成之后,InnoDB 會根據狀態緩存或者釋放 insert undo 段。

2.2 生成事務提交號

事務提交號是事務對象的 no 屬性,通常用 trx->no 表示。

代碼里,對事務提交號的注釋是 transaction serialization number,直譯成中文應該稱為事務序列號,或者事務串行號。

因為 trx->no 是在事務提交時生成的,我們還是把它稱為事務提交號更容易理解一些。

只有 update undo 段需要事務提交號。purge 線程清理 update undo 日志時,會根據 update undo 段的 undo 日志組中保存的事務提交號,決定是否能清理這個 undo 日志組中的 undo 日志。

修改 update undo 段的狀態之前,InnoDB 會生成事務提交號,保存到事務對象的 no 屬性中。

// storage/innobase/trx/trx0trx.cc
static inline bool trx_add_to_serialisation_list(trx_t *trx) {
  ...
  trx->no = trx_sys_allocate_trx_no();
  ...
}

trx_sys_allocate_trx_no() 調用 trx_sys_allocate_trx_id_or_no() 生成事務提交號。

// storage/innobase/include/trx0sys.ic
// 生成事務 ID
inline trx_id_t trx_sys_allocate_trx_id() {
  ut_ad(trx_sys_mutex_own());
  return trx_sys_allocate_trx_id_or_no();
}
// 生成事務提交號
inline trx_id_t trx_sys_allocate_trx_no() {
  ut_ad(trx_sys_serialisation_mutex_own());
  return trx_sys_allocate_trx_id_or_no();
}

從上面的代碼可以看到,生成事務 ID 和事務提交號調用的是同一個方法,trx_sys_allocate_trx_id_or_no() 的代碼如下:

// storage/innobase/include/trx0sys.ic
inline trx_id_t trx_sys_allocate_trx_id_or_no() {
  ...
  // trx_sys_allocate_trx_id_or_no() 每次被調用
  // trx_sys->next_trx_id_or_no 加 1
  // trx_id 保存的是加 1 之前的值
  trx_id_t trx_id = trx_sys->next_trx_id_or_no.fetch_add(1);
  ...
  return trx_id;
}

trx_sys->next_trx_id_or_no 保存的是下一個事務 ID 或事務提交號,具體是哪個,取決于是生成事務 ID 還是生成事務提交號先調用 trx_sys_allocate_trx_id_or_no()。

也就是說,事務 ID 和事務提交號是同一條流水線上生產出來的。我們以 trx 1 和 trx 2 兩個事務為例,來說明生成事務 ID 和事務提交號的流程。

假設此時 trx_sys->next_trx_id_or_no 的值為 100,trx 1、trx 2 啟動和提交的順序如下:

  • trx 1 啟動。
  • trx 2 啟動。
  • trx 1 提交。
  • trx 2 提交。

其于以上假設,生成事務 ID 和事務提交號的流程如下:

  • trx 1 生成事務 ID,得到 100。trx_sys->next_trx_id_or_no 加 1,結果為 101。
  • trx 2 生成事務 ID,得到 101。trx_sys->next_trx_id_or_no 加 1,結果為 102。
  • trx 1 生成事務提交號,得到 102。trx_sys->next_trx_id_or_no 加 1,結果為 103。
  • trx 2 生成事務提交號,得到 103。trx_sys->next_trx_id_or_no 加 1,結果為 104。

從以上流程可以看到,事務 ID 和事務提交號都來源于 trx_sys->next_trx_id_or_no,相互之間不會重復。

2.3 修改 update undo 段狀態

如果事務更新或刪除了用戶普通表的記錄,InnoDB 會為事務分配一個 update undo 段。

如果事務更新或刪除了用戶臨時表的記錄,InnoDB 會為事務分配另一個 update undo 段。

InnoDB 可能會給事務分配 0 ~ 2 個 update undo 段。commit 子階段會修改分配給事務的所有 update undo 段的狀態。

如果 update undo 段滿足緩存條件,它的狀態會被修改為 TRX_UNDO_CACHED,否則,它的狀態會被修改為 TRX_UNDO_TO_PURGE。

2.4 undo 日志組加入 history list

修改完 update undo 段的狀態,update undo 段的 undo 日志組會加入回滾段的 history list 鏈表。purge 線程會從這個鏈表中獲取要清理的 undo 日志組。

前面已經生成了事務提交號,這里會把事務提交號寫入 undo 日志組的頭信息中。

如果 update undo 段的狀態為 TRX_UNDO_CACHED,表示這個 undo 段需要緩存起來。它會加入回滾段的 update_undo_cached 鏈表頭部,以備后續其它事務需要 update undo 段時,能夠快速分配。

3. InnoDB 提交事務完成

前面的一系列操作完成之后,InnoDB 提交事務的操作就完成了。

現在,要把事務狀態修改為 TRX_STATE_COMMITTED_IN_MEMORY。

修改之后,新啟動的事務就能看到該事務插入或更新的記錄,看不到當前事務刪除的記錄。

接下來,InnoDB 會釋放事務執行過程中加的表鎖、記錄鎖。

釋放鎖之后,還要處理 insert undo 段。

如果 insert undo 段的狀態為 TRX_UNDO_CACHED,表示這個 undo 段需要緩存起來。它會加入回滾段的 insert_undo_cached 鏈表頭部,以備后續其它事物需要 insert undo 段時,能夠快速分配。

如果 insert undo 段的狀態為 TRX_UNDO_TO_FREE,它會被釋放,占用的 undo 頁會還給 undo 表空間。

二階段提交的 flush 子階段,已經把 prepare 階段及之前產生的 redo 日志都刷盤了。

commit 子階段,修改 insert undo 段和 update undo 段的狀態,還會產生 redo 日志。

InnoDB 不會主動觸發操作系統把這些 redo 日志刷盤,而是由操作系統決定什么時候把這些 redo 日志刷盤。

InnoDB 敢這么做,是因為這些 redo 日志對于確定事務狀態已經不重要了。即使這些 redo 日志刷盤之前,服務器突然異常關機,導致 undo 段的狀態丟失。MySQL 下次啟動時,也能正確的識別到事務已經提交完成了。

4. 重新初始化事務對象

到這里,InnoDB 提交事務該做的操作都已經做完了。提交事務完成之后,該做的事也都做了。

對于上一個事務,事務對象的使命已經結束。這里會把事務狀態修改為 TRX_STATE_NOT_STARTED。

事務對象也會被重新初始化,但是它不會被釋放。也就是說,事務對象不會回到事務池中,而是留給當前連接后續啟動新事務時復用。

5. 總結

InnoDB 提交事務,就像我們填完一個表格之后,最后蓋上的那個戳,總體上來說,要干 3 件事。

第 1 件,修改分配給事務的各 undo 段的狀態。

如果數據庫發生崩潰,重新啟動后,undo 段的狀態是影響事務提交還是回滾的因素之一。

第 2 件,修改事務對象的狀態。

如果數據據庫一直運行,不發生崩潰,就靠事務對象的狀態來標識事務是否已提交。

第 3 件,把各 undo 段中的 undo 日志組加入 history list 鏈表。

其它事務都不再需要使用這些 undo 日志時,后臺 purge 線程會清理這些 undo 日志組中的日志。

責任編輯:武曉燕 來源: 愛可生開源社區
相關推薦

2024-01-08 20:05:32

2023-12-08 08:38:15

EventLoopAPI瀏覽器

2024-05-15 09:05:42

MySQL核心模塊

2024-04-03 08:20:53

MySQL核心模塊

2024-06-05 11:49:33

2024-05-30 08:19:52

微服務架構大型應用

2023-06-09 07:18:03

開源數據庫

2023-05-11 08:14:58

國產數據庫用戶

2024-01-25 09:10:10

GoRust標準庫

2024-08-28 08:50:11

MySQL核心模塊

2023-12-26 07:37:27

2023-06-14 17:56:54

2024-08-28 13:09:50

2022-12-30 08:35:00

2023-04-26 00:00:00

框架Vue.js客戶

2023-12-28 08:43:28

前端算法搜索

2022-04-07 11:15:22

PulseEventAPI函數

2022-10-19 08:19:32

動態基線預警

2023-06-08 09:55:03

冪等計算機系統

2024-08-07 14:58:00

MySQL釋放鎖核心模塊
點贊
收藏

51CTO技術棧公眾號

自拍偷拍国产亚洲| 中文字幕在线观看不卡| 成人免费91在线看| 日本成人一区| 很黄很污的网站| 国产一二三在线观看| 成人h版在线观看| 国产一区二区精品在线| 国产电影一区| 日韩精品中文字幕一区| 色久视频在线观看| 91片黄在线观看| 亚洲国产日韩欧美| 欧美三级网页| 国产激情综合五月久久| 国产一区二区精品调教| 亚洲精品一区二区三区在线观看 | 日韩欧美大尺度| 亚洲精品电影在线| 国产私拍一区| 噜噜噜狠狠夜夜躁精品仙踪林| 337p日本欧洲亚洲大胆精品| 国产一区二区影视| 偷拍亚洲欧洲综合| 男人天堂av网站| 国产精品丝袜一区| 国产精品人人爽人人爽| 91论坛在线播放| 国产免费黄色一级片| 国产一区二区调教| 亚洲欧美日产图| 日产国产高清一区二区三区| 久久综合中文色婷婷| 99精品免费视频| 国产精品一区二区欧美| 这里只有精品在线| 国产免费一区二区三区在线能观看| 成人爽a毛片免费啪啪红桃视频| 亚洲最新视频在线| 精品成人av| 中文字幕亚洲一区二区三区五十路 | 国产伦精品一区二区三| 香蕉久久网站| 黄色成人在线看| 欧美日韩色图| 欧美亚洲国产成人精品| 激情亚洲另类图片区小说区| 久久久久久久久久久免费精品 | 精品无人区太爽高潮在线播放| 99爱视频在线观看| 久久精品人人做人人综合| 很黄很污的网站| 亚洲国产精品99| 五月综合网站| 成人av电影免费观看| 欧美成人精品在线视频| 国产黄色在线| 亚洲春色在线| 蜜臀91精品一区二区三区| 国产三级精品在线不卡| 麻豆传传媒久久久爱| 国产精品亚洲成在人线| 爽爽爽爽爽爽爽成人免费观看| 久久久久久久性潮| 9.1国产丝袜在线观看| 成人综合久久| 精品一区二区视频| 美女视频网站久久| 131美女爱做视频| 亚洲免费视频中文字幕| 男人的天堂在线视频| 精品免费日韩av| **欧美日韩在线| 国产精品久久久久久久久借妻| 国产综合色产| 992tv成人免费观看| 中文字幕精品一区二区精品绿巨人| 一区二区三区亚洲| 一级黄色在线| 亚洲欧美偷拍另类a∨色屁股| 欧美香蕉大胸在线视频观看| 视频三区在线观看| 日韩精品专区在线影院观看| 久久久加勒比| 成人国内精品久久久久一区| 日本不卡123| 色欲av无码一区二区人妻| 亚洲日本在线看| 日本三级视频在线播放| 国产成人拍精品视频午夜网站| 欧美精品中文字幕一区| 天堂中文在线8| 久久成人人人人精品欧| 国产精品久久电影观看| 色香蕉成人二区免费| 香蕉久久精品| 欧美日韩在线亚洲一区蜜芽| 一本大道色婷婷在线| 欧美亚洲另类制服自拍| 香蕉视频成人在线观看| 国产一伦一伦一伦| 日韩午夜激情免费电影| 高清精品视频| 亚洲国产一区二区三区在线播| 亚洲欧美在线视频观看| 美女精品导航| 国产精品久久久久久亚洲调教 | 国产一区二区导航在线播放| 成人高清在线观看免费| 亚洲福利在线视频| 久久影院一区| 欧美激情精品久久久久久小说| 日韩三级视频中文字幕| 日韩视频在线观看| 六月丁香婷婷在线| 精品国精品自拍自在线| 久久高清免费| 天天爱天天操天天干| 在线综合视频播放| 日韩激情网站| 91成人在线观看喷潮教学| 欧美一区二区三区人| 成人在线免费观看网站| 北条麻妃在线一区| 国产午夜精品久久久| 中文精品久久| 日韩av电影免费| 久久久久久久av| 国产成人在线网站| 污污的网站在线免费观看| 7777奇米亚洲综合久久| 亚洲一区在线观看免费观看电影高清 | 神马久久午夜| 国产精品一区二区三区在线| 一区二区三区四区中文字幕| 电影中文字幕一区二区| 丁香色欲久久久久久综合网| 日韩一区二区电影在线| 亚洲午夜精品久久久久久app| 精品女厕厕露p撒尿| 欧美综合一区第一页| 国产精品每日更新| 福利资源在线久| av免费在线观| 狂野欧美性猛交xxxx| 三级在线播放| 亚洲熟妇无码另类久久久| 国产v亚洲v天堂无码| 国产乱色国产精品免费视频| 国产精品成人观看视频国产奇米| 99久久久久久| 精品亚洲a∨| 美女扒开大腿让男人桶| 亚洲欧美成人在线| 国产精品一级二级三级| 免费网站在线观看人| 欧美精品久久| 欧美亚洲综合色| 精品二区久久| 好了av在线| 欧洲亚洲一区二区三区四区五区| 欧美日韩免费不卡视频一区二区三区| 欧美精品1区| 91精彩视频在线播放| 久久综合久久综合这里只有精品| 伊人久久成人| 欧美日韩亚洲在线观看| 日本午夜精品| av在线电影免费观看| www.av蜜桃| 在线观看免费黄色片| 57pao国产成人免费| 欧美国产日韩免费| 成人欧美一区二区三区在线 | 羞羞的网站在线观看| 四虎精品在线| h片在线免费观看| 不卡的av一区| 久久国产精品99精品国产| 中日韩高清电影网| 亚洲精品成人自拍| 日韩成人中文电影| 成人性视频网站| 亚洲精品一区二区在线观看| 国产图片一区| 欧美成人xxxxx| 农村寡妇一区二区三区| 99精品美女| av日韩在线看| 国产日本欧美一区二区三区在线| 国产免费一区| 色噜噜一区二区| 热久久免费国产视频| 日韩一区二区精品| 欧美插天视频在线播放| 在线观看欧美日韩| 久久亚洲影音av资源网| 欧美精品一区二区三区高清aⅴ | 国产精品一区三区| 国产一区二区丝袜|