mysql 事務及隔離級別

2021-10-05 04:48:15 字數 1766 閱讀 8230

原子性: 回滾日誌(undo log)

永續性: 重做日誌(redo log)

隔離性: 鎖

一致性:(通過aid及使用者自定義完整性保證)

一致性是事務追求的最終目標:前面提到的原子性、永續性和隔離性,都是為了保證資料庫狀態的一致性。此外,除了資料庫層面的保障,一致性的實現也需要應用層面進行保障。

一致性是指事務執行結束後,資料庫的完整性約束沒有被破壞,事務執行的前後都是合法的資料狀態。資料庫的完整性約束包括但不限於:實體完整性(如行的主鍵存在且唯一)、列完整性(如字段的型別、大小、長度要符合要求)、外來鍵約束、使用者自定義完整性(如轉賬前後,兩個賬戶餘額的和應該不變)。不同於cap的一致性,cap的一致性指的是多個節點資料保持一致,

未提交讀(問題:髒讀)-> 提交讀(問題:不可重複讀)->可重複讀(預設)(問題:幻讀 )-> 序列化或者mvcc(讀)及x鎖+gap鎖(寫)

幻讀

指的是當某個事務在讀取某個範圍內的記錄時,另外乙個事務又在該範圍內插入了新的記錄,當之前的事務再次讀取該範圍的記錄時,會產生幻行(phantom row). —高效能mysql(權威)

不可重複度

乙個事務內兩次讀之間,另乙個事務修改了資料,兩次讀的內容不一樣

可重複讀

乙個事務啟動的時候,能夠看到所有已經提交的事務結果。但是之後,這個事務執行期間,其他事務的更新對它不可見

mysql如何實現避免幻讀

innodb 的mvcc ,是通過在每行記錄後面儲存兩個隱藏的列來實現的。這兩個列,乙個儲存了行的建立時間,乙個儲存行的過期時間(或刪除時間)。當然儲存的並不是實際的時間值,而是系統版本號(system version number) 。每開始乙個新的事務,系統版本號都會自動遞增。事務開始時刻的系統版本號會作為事務的版本號,用來和查詢到的每行記錄的版本號進行比較。下面看一下在repeatable read 隔離級別下, mvcc 具體是如何操作的。

select

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

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

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

只有符合上述兩個條件的記錄,才能返回作為查詢結果。

insert

innodb 為新插入的每一行儲存當前系統版本號作為行版本號。

delete

innodb 為刪除的每一行儲存當前系統版本號作為行刪除標識。

update

innodb為插入一行新記錄,儲存當前系統版本號作為行版本號,同時儲存當前系統 版本號到原來的行作為行刪除標識。

可以簡單的理解為x鎖(排他鎖)+gap鎖

select * from table where ?;

select * from table where ? lock in share mode;

select * from table where ? for update;

insert into table values (…);

update table set ? where ?;

delete from table where ?;

MySQL事務及事務隔離級別

原子性 atomicity 事務是乙個原子操作單元,其對資料的修改,要麼全都執行,要麼全都不執行。一致性 consistent 在事務開始和完成時,資料都必須保持一致狀態。這意味著所有相關的資料規則都必須應用於事務的修改,以保持資料的完整性 事務結束時,所有的內部資料結構 如b樹索引或雙向鍊錶 也都...

mysql 事務及隔離級別

事務 transaction 是由一系列對資料庫中的資料進行操作訪問所組成的乙個程式執行單元 在同乙個事務中所進行的操作,要麼都成功,要麼就什麼都不做。理想中的事務必須滿足四大特性,這就是大名鼎鼎的acid。a atomicity 原子性 是指乙個事務要麼全部執行,要麼不執行,也就是說乙個事務不可能...

MYSQL事務及隔離級別

二,事務的四大特性 三,事務隔離級別 1,第一正規化資料庫中每一列都是不可再分的2,第二正規化非主鍵字段依賴主鍵字段。3,第三正規化非主鍵字段不能相互依賴當我需要執行多個sql語句的時候,我們會使用事務,這幾個sql語句會一起執行,要麼全成功,要麼全失敗。原子性 事務所有操作當作乙個原子性的操作。事...