MySQL 隔離級別

2021-10-04 08:21:41 字數 1782 閱讀 4254

原子性

事務是乙個原子操作單元,事務中包含的所有操作要麼都做,要麼都不做,沒有第三種情況。

一致性

事務操作前和操作後都必須滿足業務規則約束,比如說a向b轉賬,轉賬前和轉賬後ab兩個賬戶的總金額必須是一致的。

隔離性

隔離性是資料庫允許多個併發事務同時對資料進行讀寫的能力,隔離性可以防止事務併發執行時由於交叉執行導致資料不一致的問題。

永續性

事務完成後,對資料的修改是永久的,即使出現系統故障也不會丟失。

更新丟失

當兩個事務選擇同一行,然後更新資料,由於每個事務都不知道其他事務的存在,就會發生丟失更新的問題,(你我同時讀取同一行資料,進行修改,你commit之後我也commit,那麼我的結果將會覆蓋掉你的結果)。

髒讀

乙個事務正在對一條記錄做修改,在這個事務提交之前,別的事務讀取到了這個事務修改之後的資料,也就是說,乙個事務讀取到了其他事務還沒有提交的資料,就叫做髒讀。

不可重複讀

乙個事務讀某條資料讀兩遍,讀到的是不一樣的資料,也就是說,乙個事務在進行中讀取到了其他事務對舊資料的修改結果,(比如說 我開乙個事務 修改某條資料 先查後改 執行修改動作的時候發現這條資料已經被別的事務刪掉了)

幻讀

乙個事務中,讀取到了其他事務新增的資料,彷彿出現了幻象。(幻讀與不可重複讀類似,不可重複讀是讀到了其他事務update/delete的結果,幻讀是讀到了其他事務insert的結果)

未提交讀(read-uncommitted)

在乙個事務中,可以讀取到其他事務未提交的資料變化,這種讀取其他會話還沒提交的事務,叫做髒讀現象,在生產環境中切勿使用。

已提交讀(read-committed)

在乙個事務中,可以讀取到其他事務已經提交的資料變化,這種讀取也就叫做不可重複讀,因為兩次同樣的查詢可能會得到不一樣的結果。

可重複讀(repetable-read)

mysql預設隔離級別,在乙個事務中,直到事務結束前,都可以反覆讀取到事務剛開始時看到的資料,並一直不會發生變化,避免了髒讀、不可重複讀現象,但是它還是無法解決幻讀問題。

可序列化(serializable)

這是最高的隔離級別,它強制事務序列執行,避免了前面說的幻讀現象,簡單來說,它會在讀取的每一行資料上都加鎖,所以可能會導致大量的超時和鎖爭用問題

隔離級別一覽表

隔離級別

讀資料一致性

髒讀不可重複

幻讀未提交讀

最低級別,只保證不讀取物理上損壞的資料有有

有已提交讀

語句級無有有

可重複讀

事務級無無有

可序列化

最高端別,事務級無無

隔離級別越嚴格,內部工作機制越複雜,較鬆散的隔離級別通常可以支援更高的併發。

– 檢視當前資料庫的隔離級別

show variables like 「%tx_isolation%」

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

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

mysql隔離級別驗證 mysql 隔離級別測試

1 設定隔離級別,包括 全域性 global.tx isolation,會話級別 session.tx isolation mysql workbench的會話 2 建立測試表 注意 unsigned auto increment primary key用法 預設引擎的設定 建立測試表 use te...

Mysql隔離級別

先記錄下幾個概念 髒讀 在當前事務中,讀取到其他事務中還未提交的資料 不可重複讀 在當前事務中,讀取某一行的資料,可能讀出的資料不同 幻讀 在當前事務中,讀取記錄時,另外的事務插入了新的記錄,當前事務可能出現新的行。四種隔離級別 1.未提交讀 可能讀到髒資料 會話a中的隔離級別為未提交讀 表中原來的...