簡述MySQL的事務隔離級別和MVCC

2021-10-06 19:57:21 字數 1887 閱讀 2382

mysql事務隔離級別

(1)未提交讀(read uncommitted):乙個事務讀到了另外乙個未提交事務修改過的資料

(2)已提交讀(read committed):乙個事務只能讀取到另外乙個已提交事務修改過的資料;

(3)可重複讀(repeated read):首先乙個事務只能讀取另外乙個事務已經提交修改過的資料,但是當第一次讀過某條資料後,及時其他事務修改並提交該值,那麼當前事務讀取的仍然是第一次讀取的值。這裡補充一下幻讀

(4)序列化(serializable):上面三種隔離級別都允許對同一條記錄的讀寫併發操作,序列化就是序列執行每個操作。

mysql事務隔離級別

(1)未提交讀(read uncommitted):乙個事務讀到了另外乙個未提交事務修改過的資料

(2)已提交讀(read committed):乙個事務只能讀取到另外乙個已提交事務修改過的資料;

(3)可重複讀(repeated read):首先乙個事務只能讀取另外乙個事務已經提交修改過的資料,但是當第一次讀過某條資料後,及時其他事務修改並提交該值,那麼當前事務讀取的仍然是第一次讀取的值。這裡補充一下幻讀

(4)序列化(serializable):上面三種隔離級別都允許對同一條記錄的讀寫併發操作,序列化就是序列執行每個操作。

隔離級別   

髒讀不可重複讀

幻讀讀未提交√√

√讀已提交√√

可重複讀

√序列化

mvcc

mvcc即multiversion concurrency control,多版本併發控制。這是一種提高併發的技術,最早的資料庫只能讀讀併發,讀寫、寫讀、寫寫都會阻塞,引入多版本之後只有寫寫會阻塞,從而提高了資料庫的併發能力。

為了加深理解,我們有必要了解mysql的記錄結構,mysql表中的每一條記錄都會存在三個隱藏字段用於記錄額外資訊:

(1)db_trx_id:事務id,innodb中每個事務都有乙個唯一的事務id,它是順序遞增的。每次事務更新資料,都會生成乙個新的資料版本,然後將事務id賦值給當前記錄的db_trx_id。

(2)db_roll_ptr:回滾指標,指向undolog。資料更新記錄會記錄在undo log中,然後用db_roll_ptr指向它。

(3)row_id:如果表中不存在主鍵或者唯一字段,那麼就會存在row_id。

一行資料記錄可能同時存在多個版本,但並不是所有記錄都是對當前事務可見的,那麼如何判斷資料版本是否對當前事務可見。

首先需要了解一致性檢視,每個事務開始後會建立乙個一致性檢視,檢視中會儲存所有活躍的事務,即還未提交的事務。一致性檢視只會在rr(可重複讀)和rc(已提交讀)下生成,兩者的區別在於,rr在第乙個查詢語句的是時候就會生成,而rc是對於每乙個查詢語句都會生成。我們可以通過下面的方式判斷版本對於當前事務是否可見。

(1)若版本事務id小於當前活躍事務id最小值,說明當前版本事務已提交,當前版本對於當前事務可見。

(2)若版本事務id大於當前活躍事務id最大值,說明這個版本是在當前事務建立之後生成的,所以當前版本對於當前事務不可見。

(3)若版本事務id是當前活躍事務id之一,說明當前版本所屬事務還未提交,所以當前版本對於當前事務不可見。

(4)若版本事務id不是當前活躍事務id之一,但是介於活躍事務最小值和最大值之間,說明當前版本所屬事務已提交,所以當前版本對於當前事務可見。

當前讀和快照讀:使用mvcc機制讀取之前的版本資料稱之為快照讀,如果select語句中包含for update,那麼就會將當前記錄鎖住,如果別的事務也訪問這個記錄,就會阻塞,知道當前事務執行完畢,這種查詢時當前記錄的版本資料,稱之為當前讀。

綜上所述:對於rr隔離級別,普通查詢只能查到事務啟動前已經提交的版本資料;對於rc隔離級別,普通查詢可以查到事務查詢語句啟動前就已經提交的版本資料。

mysql隔離級別 MySQL 事務隔離級別

mysql innodb所提供的事務滿足acid的要求,事務是通過事務日誌中的redo log和undo log來實現原子性 undo log 一致性 undo log 永續性 redo log 事務通過鎖機制實現隔離性。1 事務隔離級別與實現read uncommitted 讀未提交 read c...

mysql事務隔離級別詳解 事務的隔離級別詳解

事務的隔離級別 在資料庫操作中,為了有效保證併發讀取資料的正確性,提出的事務隔離級別。問題的提出 資料庫是要被廣大客戶所共享訪問的,那麼在資料庫操作過程中很可能出現以下幾種不確定情況。更新丟失 兩個事務都同時更新一行資料,乙個事務對資料的更新把另乙個事務對資料的更新覆蓋了。這是因為系統沒有執行任何的...

MySQL事務隔離級別

sql標準定義了4類隔離級別,包括了一些具體規則,用來限定事務內外的哪些改變是可見的,哪些是不可見的。低階別的隔離級一般支援更高的 併發處理,並擁有更低的系統開銷。read uncommitted 讀取未提交內容 在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應用,...