Mysql 事務基本概念及MVCC

2021-10-06 10:34:32 字數 3665 閱讀 7825

1.事務id的分配時機

這裡要注意在預設情況下,只有執行修改操作(如insert、delete、update語句)才會分配乙個事務id,select並不會。

如果通過start transaction使用事務時,並不會馬上就分配事務id,也要第一次執行修改操作才會分配,如果開啟事務後第一條語句時select,系統會產生如下所示的隨機id,等到執行了真正的修改操作時,才會分配乙個正式的事務id

trx_id

281479839177256

2.事務id的產生

3.事務的四大特徵2.1事務隔離級別

髒讀不可重複讀

幻讀read uncommitted√√

√read committed×√

√repeatable read××

√serializable××

×隔離級別從上往下不斷提公升,但是並發行也在不斷下降

2.2 不可重複讀和幻讀的區別

髒讀比較好理解,對於不可重複讀和幻讀,可能會難以區分

read committed

時間順序

session a

session b

1begin;

2select name from people where id=1; (結果為「james」)

3update people set name=「jorden」 where id=1;(隱式提交)

4select name from people where id=1; (結果為"jorden")

5update people set name=「kobe」 where id=1;(隱式提交)

6select name from people where id=1; (結果為"kobe")

在session b中提交了幾個隱式事務(就是mysql的預設模式,自動commit),這些事務都修改了id為1的記錄的列c的值,每次事務提交之後,session a中的事務都可以檢視到最新的值。這種現象也被稱之為不可重複讀。

repeatable read

時間順序

session a

session b

1begin;

2select name from people where id=1; (結果為「james」)

3update people set name=「jorden」 where id=1;(隱式提交)

4select name from people where id=1; (結果為"james")

5update people set name=「kobe」 where id=1;(隱式提交)

6select name from people where id=1; (結果為"james")

可以發現解決了不可重複讀,但是如果執行下面的例子

時間順序

session a

session b

1begin;

2select name from people; (結果為「james」)

3insert into people(id,name) values(2,「oven」);

4select name from people ; (結果為"james" 查詢不到"oven")

5insert into people(id,name) values(2,「love」); (會提示主鍵衝突,這就是幻讀,明明沒有這個資料,卻實際存在了)

兩者的區別:

3.1 undo log

每條資料修改(insert、update或delete)操作都伴隨一條undo log的生成,並且回滾日誌必須先於資料持久化到磁碟上

所謂的回滾就是根據回滾日誌做逆向操作,比如delete的逆向操作為insert,insert的逆向操作為delete,update的逆向為update等。

3.2 redo log

先介紹一下mysql的資料儲存機制

mysql的基本儲存結構是,mysql的表資料是存放在磁碟上的,因此想要訪問的時候都要經歷磁碟io,然而即使是使用ssd磁碟io也是非常消耗效能的。

為此,為了提公升效能innodb提供了緩衝池(buffer pool),buffer pool中包含了磁碟資料頁的對映,可以當做快取來使用,緩衝池是放在記憶體中的:

**讀資料:**會首先從緩衝池中讀取,如果緩衝池中沒有,則從磁碟讀取在放入緩衝池;

**寫資料:**會首先寫入緩衝池,緩衝池中的資料會定期同步到磁碟中;

那麼現在又乙個問題,如果修改了資料放到緩衝池以後,緩衝池的資料還沒io到磁碟,資料庫關了,資料是否會丟失呢?

這時就會用到redo log,每次對記錄的修改寫入緩衝池的時候,也會寫乙份redo log,記錄著哪一頁修改了什麼資料。redo log也是放在磁碟中的,其實也會現在內從中有buffer,先寫到buffer裡,在寫到redo log中,

可以發現寫入redo log也是磁碟io,但是他是順序io,比從buffer pool中將資料頁隨機io到磁碟快很多。所以即使這時資料庫掛了,根據redo log中的資料也能進行恢復。

3.3 mvcc機制的介紹

建議閱讀文章

《mysql事務隔離級別和mvcc》

本文非常詳細的介紹了mvcc中版本鏈和readview的操作過程。語言通俗易懂,還有很好的配圖,絕對是新手小白的最佳讀物!!!!

版本鏈:對於innodb引擎,聚簇索引的葉子節點還包含了兩個隱藏列

readview:當前活躍的事務id的集合。因為read committedrepeatable read兩種事務隔離級別下,乙個事務查詢記錄時需要判斷一下該記錄的版本鏈中的哪個版本是當前事務可見的。

注意:

delete:我個人不確定是如何修改,如果僅僅修改trx_id,然後將這個記錄放到undo日誌的話。

舉個例子:

id=1的記錄有更早的事務插入得到的

所以我覺得trx_id只能用來存放產生記錄的事務id(後面用產生id來代替),還需要有乙個隱藏列來存放刪除記錄的事務id(後面用產刪除id來代替)。

innodb會根據以下兩個條件檢查每行記錄:

a.innodb只會查詢版本早於當前事務版本的資料行(也就是,記錄的產生id小於或等於事務的id),這樣可以確保事務讀取的行,要麼是在事務開始前已經存在的,要麼是事務自身插入或者修改過的.

b.記錄的刪除id本要麼未定義,要麼大於當前事務id,這可以確保事務讀取到的行,在事務開始之前未被刪除.

只有a,b同時滿足的記錄,才能返回作為查詢結果.

參考:mysql事務

沒想到mysql還會問這些…

mysql事務隔離級別和mvcc

mysql 四種事務隔離級別

mysql mvcc實現機制

mysql版本概念 MySQL基本概念及基本操作

資料庫基本概念 資料庫是什麼 儲存資料的倉庫 1.列表 字典.等等 都是記憶體中的 缺點 斷電丟失 優點 速度快 2.檔案儲存 缺點 速度慢 優點 可以實現永久儲存 本質就是一套基於cs結構的 客戶端和伺服器程式,最終的資料儲存在伺服器端的磁碟中 為什麼要使用資料庫 直接使用檔案儲存帶來的問題 1....

MySQL基本概念及操作命令(一)

create database ifnot exists new database name default charset utf8 collate utf8 general ci 注 collate從網上搜到的結果是預設排序規則,可設定多個,本人認為不是特別有用,與charset對應就好。cre...

MVC的基本概念

mvc是一種軟體的設計模式 m model模型 處理業務邏輯 e.g service.admin.class 工具類 v view檢視 介面 使用php編寫 e.g login.php 等就是檢視 c controller 控制器 控制器的主要作用是接受使用者的請求,並呼叫某個service的方法,...