MySql中事務隔離級別的解決方案MVCC

2021-10-23 07:20:49 字數 921 閱讀 2738

對於mysql四種事務隔離級別,為了保證其資料一致性和高併發場景下的效能,於是使用mvcc。

mvcc是生成乙個資料請求時間點的一致性資料快照,並用這個快照來提供一定級別的一致性讀取。

也就是相當於一定時間內的所有查詢都查這個資料塊照裡的內容,這樣保證了讀一致性,解決了不可重複讀。

原理:在mysql中,innodb引擎為每條記錄都提供了三個隱藏字段,

db_row_id – 行標識,在沒有索引的時候為預設索引,沒有索引的時候操作會鎖表,因為鎖住了所有的db_row_id

db_trx_id – 插入或更新行的最後乙個事務的事務id,自動遞增。也就相當於是版本號

db_roll_ptr – 回滾指標 (刪除版本號)

db_trx_id:每一行記錄的這個值,就是代表最後一次更新(插入或者更新)該條記錄的事務id。

每個事務查詢,只能查詢到建立時間小於等於當前事務id的(已提交的)資料,和刪除時間大於當前事務id的行(或未刪除)

前半句好理解,就是查詢事務只能查到在這個事務之前的資料,在這個事務之後,其他事務進行的操作,查不到。

後半句可能難以理解,刪除時間大於當前事務id的行怎麼還會被查到呢?不是已經刪除了嗎?

實際上看mvcc的描述,它是乙個資料快照,也就是說雖然這條資料刪除了(如果再次查詢表會發現表裡已經沒有這條資料了),但是在資料快照裡,它還未刪除

只是更新了隱藏字段 db_roll_ptr 的值(變為了刪除事務的id)。

還有的人疑惑乙個點,可以在這裡討論一下:

比如事務1開啟事務,事務2開啟事務查詢,此時沒有資料,事務1版本號小於事務2,事務1新增資料,提交,那麼事務2能查到新的資料嗎?

按規則來說是能查到,但是這樣就產生幻讀的現象。而innodb在rr(可重複讀)中是解決了幻讀的。

解答:應該是需要借助,readview undo log 間隙鎖 日後有機會再補充吧。

MySQL事務隔離級別的型別

1.事務隔離級別型別以及序列化介紹 事務的隔離性是多個使用者併發訪問資料庫時,資料庫為每乙個使用者開啟的事務,不能被其他事務的運算元據所干擾,多個併發事務之間要相互隔離。在併發下事務會容易出現一些問題 髒讀 乙個事務開始讀取了某行資料,另外乙個事務已經更新了此資料但沒有能夠及時提交。這是相當危險的,...

MySQL事務隔離級別的實現原理

在mysql的眾多儲存引擎中,只有innodb支援事務,所有這裡說的事務隔離級別指的是innodb下的事務隔離級別。讀未提交 乙個事務可以讀取到另乙個事務未提交的修改。這會帶來髒讀 幻讀 不可重複讀問題。基本沒用 讀已提交 乙個事務只能讀取另乙個事務已經提交的修改。其避免了髒讀,但仍然存在不可重複讀...

MySQL事務隔離級別的實現原理

在mysql的眾多儲存引擎中,只有innodb支援事務,所有這裡說的事務隔離級別指的是innodb下的事務隔離級別。讀未提交 乙個事務可以讀取到另乙個事務未提交的修改。這會帶來髒讀 幻讀 不可重複讀問題。基本沒用 讀已提交 乙個事務只能讀取另乙個事務已經提交的修改。其避免了髒讀,但仍然存在不可重複讀...