自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

MySQL 核心模塊揭秘

數(shù)據(jù)庫 MySQL
server 層會(huì)創(chuàng)建一個(gè) SAVEPOINT 對(duì)象,用于存放 savepoint 信息。binlog 會(huì)把 binlog offset 寫入 server 層為它分配的一塊 8 字節(jié)的內(nèi)存里。 InnoDB 會(huì)維護(hù)自己的 savepoint 鏈表,里面保存著 trx_named_savept_t 對(duì)象。

1.undo 日志序號(hào)

InnoDB 的事務(wù)對(duì)象有一個(gè)名為 undo_no 的屬性。事務(wù)每次改變(插入、更新、刪除)某個(gè)表的一條記錄,都會(huì)產(chǎn)生一條 undo 日志。這條 undo 日志中會(huì)存儲(chǔ)它自己的序號(hào)。這個(gè)序號(hào)就來源于事務(wù)對(duì)象的 undo_no 屬性。

也就是說,事務(wù)對(duì)象的 undo_no 屬性中保存著事務(wù)改變(插入、更新、刪除)某個(gè)表中下一條記錄產(chǎn)生的 undo 日志的序號(hào)。

每個(gè)事務(wù)都維護(hù)著各自獨(dú)立的 undo 日志序號(hào),和其它事務(wù)無關(guān)。

每個(gè)事務(wù)的 undo 日志序號(hào)都從 0 開始。事務(wù)產(chǎn)生的第 1 條 undo 日志的序號(hào)為 0,第 2 條 undo 日志的序號(hào)為 1,依此類推。

InnoDB 的 savepoint 結(jié)構(gòu)中會(huì)保存創(chuàng)建 savepoint 時(shí)事務(wù)對(duì)象的 undo_no 屬性值。

2.savepoint 結(jié)構(gòu)

我們通過 SQL 語句創(chuàng)建一個(gè) savepoint 時(shí),server 層、binlog、InnoDB 會(huì)各自創(chuàng)建用于保存 savepoint 信息的結(jié)構(gòu)。

server 層的 savepoint 結(jié)構(gòu)是一個(gè) SAVEPOINT 類型的對(duì)象,主要屬性如下:

  • prev:指向 server 層的 savepoint 鏈表中,上一次創(chuàng)建的 SAVEPOINT 對(duì)象。
  • name:savepoint 的名字。
  • mdl_savepoint:創(chuàng)建這個(gè) savepoint 之前,事務(wù)加了哪些 MDL 鎖。 binlog 的 savepoint 結(jié)構(gòu)很簡(jiǎn)單,是一個(gè) 8 字節(jié)的整數(shù)。這個(gè)整數(shù)的值,是創(chuàng)建 savepoint 時(shí)事務(wù)已經(jīng)產(chǎn)生的 binlog 日志的字節(jié)數(shù),也是接下來新產(chǎn)生的 binlog 日志寫入 trx_cache 的 offset。

為了方便介紹,我們把這個(gè)整數(shù)值稱為 binlog offset。

InnoDB 的 savepoint 結(jié)構(gòu)是一個(gè) trx_named_savept_t 類型的對(duì)象,主要屬性如下:

  • name:InnoDB 的 savepoint 名字。這個(gè)名字是 InnoDB 自己生成的,和 server 層的 SAVEPOINT 對(duì)象中保存的 savepoint 名字不一樣。
  • savept:也是一個(gè)對(duì)象,類型為 trx_savept_t,里面保存著創(chuàng)建 savepoint 時(shí),事務(wù)對(duì)象的 undo_no 屬性值。
  • trx_savepoints:InnoDB 中多個(gè) trx_named_savept_t 對(duì)象形成的鏈表。 創(chuàng)建 savepoint 時(shí),server 層會(huì)分配一塊 96 字節(jié)的內(nèi)存,除了存放它自己的 SAVEPOINT 對(duì)象,還會(huì)存放 binlog offset 和 InnoDB 的 trx_named_savept_t 對(duì)象。

server 層的 SAVEPOINT 對(duì)象占用這塊內(nèi)存的前 48 字節(jié),InnoDB 的 trx_named_savept_t 對(duì)象占用中間的 40 字節(jié),binlog offset 占用最后的 8 字節(jié)。

圖片圖片

3.查找同名 savepoint

客戶端連接到 MySQL 之后,MySQL 會(huì)分配一個(gè)專門用于該連接的用戶線程。

用戶線程中有一個(gè) m_savepoints 鏈表,用戶創(chuàng)建的多個(gè) savepoint 通過 prev 屬性形成鏈表,m_savepoints 就指向最新創(chuàng)建的 savepoint。

圖片圖片

server 層創(chuàng)建 savepoint 之前,會(huì)按照創(chuàng)建時(shí)間從新到老,逐個(gè)查看鏈表中是否存在和本次創(chuàng)建的 savepoint 同名的 savepoint。

4.刪除同名 savepoint

如果在用戶線程的 m_savepoints 鏈表中找到了和本次創(chuàng)建的 savepoint 同名的 savepoint,需要先刪除 m_savepoints 鏈表中的同名 savepoint。

找到的同名 savepoint,是 server 層的 SAVEPOINT 對(duì)象,它后面的內(nèi)存區(qū)域分別保存著 InnoDB 的 trx_named_savept_t 對(duì)象、binlog offset。

binlog 是個(gè)老實(shí)孩子,乖乖的把 binlog offset 寫入了 server 層為它分配的內(nèi)存里。刪除同名 savepoint 時(shí),不需要單獨(dú)處理 binlog offset。

InnoDB 就不老實(shí)了,雖然 server 層也為 InnoDB 的 trx_named_savept_t 對(duì)象分配了內(nèi)存,但是 InnoDB 并沒有往里面寫入內(nèi)容。

事務(wù)執(zhí)行過程中,用戶每次創(chuàng)建一個(gè) savepoint,InnoDB 都會(huì)創(chuàng)建一個(gè)對(duì)應(yīng)的 trx_named_savept_t 對(duì)象,并加入 InnoDB 事務(wù)對(duì)象的 trx_savepoints 鏈表的末尾。

因?yàn)?InnoDB 自己維護(hù)了一個(gè)存放 savepoint 結(jié)構(gòu)的鏈表,server 層刪除同名 savepoint 時(shí),InnoDB 需要找到這個(gè)鏈表中對(duì)應(yīng)的 savepoint 結(jié)構(gòu)并刪除,流程如下:

  • server 層把同名 savepoint 的 SAVEPOINT 對(duì)象后面分配給 trx_named_savept_t 對(duì)象的內(nèi)存地址傳給 InnoDB。
  • InnoDB 根據(jù)自己的算法把內(nèi)存地址轉(zhuǎn)換為字符串,作為 InnoDB 的 savepoint 名字,到事務(wù)對(duì)象的 trx_savepoints 鏈表中找到對(duì)應(yīng)的 trx_named_savept_t 對(duì)象,并從鏈表中刪除該對(duì)象。

InnoDB 從事務(wù)對(duì)象的 trx_savepoints 鏈表中刪除 trx_named_savept_t 對(duì)象之后,server 層接著從用戶線程的 m_savepoints 鏈表中刪除 server 層的 SAVEPOINT 對(duì)象,也就連帶著清理了 binlog offset。

5.保存 savepoint

處理完查找、刪除同名 savepoint 之后,server 層就正式開始創(chuàng)建 savepoint 了,這個(gè)過程分為 3 步。

第 1 步,binlog 會(huì)生成一個(gè) Query_log_event。

以創(chuàng)建名為 test_savept 的 savepoint 為例,這個(gè) event 的內(nèi)容如下:

SAVEPOINT test_savept binlog event 寫入 trx_cache 之后,binlog offset 會(huì)寫入 server 層為它分配的 8 字節(jié)的內(nèi)存中。

第 2 步,InnoDB 創(chuàng)建 trx_named_savept_t 對(duì)象,并放入事務(wù)對(duì)象的 trx_savepoints 鏈表的末尾。

圖片圖片

trx_named_savept_t 對(duì)象的 name 屬性值是 InnoDB 的 savepoint 名字。這個(gè)名字是根據(jù) server 層為 InnoDB 的 trx_named_savept_t 對(duì)象分配的內(nèi)存的地址計(jì)算得到的。

trx_named_savept_t 對(duì)象的 savept 屬性,是一個(gè) trx_savept_t 類型的對(duì)象。這個(gè)對(duì)象里保存著創(chuàng)建 savepoint 時(shí),事務(wù)對(duì)象中 undo_no 屬性的值,也就是下一條 undo 日志的序號(hào)。

第 3 步,把 server 層的 SAVEPOINT 對(duì)象加入用戶線程的 m_savepoints 鏈表的尾部。

圖片圖片

6.總結(jié)

server 層會(huì)創(chuàng)建一個(gè) SAVEPOINT 對(duì)象,用于存放 savepoint 信息。

binlog 會(huì)把 binlog offset 寫入 server 層為它分配的一塊 8 字節(jié)的內(nèi)存里。

InnoDB 會(huì)維護(hù)自己的 savepoint 鏈表,里面保存著 trx_named_savept_t 對(duì)象。

如果 m_savepoints 鏈表中存在和本次創(chuàng)建的 savepoint 同名的 savepoint, 創(chuàng)建新的 savepoint 之前,server 層會(huì)從鏈表中刪除這個(gè)同名的 savepoint。

server 層創(chuàng)建的 SAVEPOINT 對(duì)象會(huì)放入 m_savepoints 鏈表的末尾。

InnoDB 創(chuàng)建的 trx_named_savept_t 對(duì)象會(huì)放入事務(wù)對(duì)象的 trx_savepoints 鏈表的末尾。

責(zé)任編輯:武曉燕 來源: 愛可生開源社區(qū)
相關(guān)推薦

2024-05-15 09:05:42

MySQL核心模塊

2024-06-05 11:49:33

2024-08-28 08:50:11

MySQL核心模塊

2024-03-27 13:33:00

MySQLInnoDB事務(wù)

2024-08-07 14:58:00

MySQL釋放鎖核心模塊

2024-05-29 10:17:01

2024-10-16 11:11:51

隔離InnoDB死鎖

2024-10-30 10:38:08

2024-09-04 08:44:18

MySQL核心模塊

2025-02-26 08:26:38

2024-11-05 10:52:07

2010-01-26 14:04:02

2021-06-21 17:00:05

云計(jì)算Hologres云原生

2023-08-24 10:33:19

serviceexportsinfo類

2025-01-17 08:17:55

2022-07-12 10:38:25

分布式框架

2009-07-21 09:06:14

開發(fā)團(tuán)隊(duì)Windows 7

2024-05-08 16:54:21

Python編程開發(fā)

2019-01-23 10:42:21

華為云

2022-10-28 07:27:17

Netty異步Future
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)