MySQL 事務的ACID 併發問題 隔離級別

2021-08-22 14:52:39 字數 1233 閱讀 5267

小結:不可重複讀的和幻讀很容易混淆,不可重複讀側重於修改,幻讀側重於新增或刪除。解決不可重複讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表

事務隔離級別

髒讀不可重複讀

幻讀鎖策略

讀未提交(read-uncommitted)是是

是不會鎖住指定的行

不可重複讀(read-committed)否是

是寫資料時鎖相應行

可重複讀(repeatable-read)(預設)否否

是如果有索引(包括主鍵索引)的時候,以索引列為條件更新資料,會存在間隙鎖、行鎖、下一鍵鎖的問題,從而鎖住一些行;如果沒有索引,更新資料時會鎖住整張表。

序列化(serializable)否否

否讀寫資料時都會鎖整張表

隔離級別越高,越能保證資料的完整性和一致性,但是對併發效能的影響也越大。對於多數應用程式,可以優先考慮把資料庫系統的隔離級別設為read committed,它能夠避免髒讀取,而且具有較好的併發效能。儘管它會導致不可重複讀、幻讀這些併發問題,在可能出現這類問題的個別場合,可以由應用程式採用悲觀鎖或樂觀鎖來控制。

可通過select @@tx_isolation;語句來獲取當前事務的隔離級別,mysql中預設為repeatable-read

可通過set session transaction isolation level [read uncommitted | read committed | repeatable read | serializable ]來設定事務的隔離級別。

idvalue

1100

2200

3300

可以看到這個過程中並沒有出現不可重複讀的問題,但是在sessiona提交後id為1的記錄的value並沒有變成90,而是變成了80,可見在執行value=value-10的時候是使用磁碟中的資料來進行計算的,所以變成了80,資料的一致性沒有被破壞。

可重複讀的隔離級別下使用了mvcc機制,a事務中讀取的是記錄的快照版本,而非最新版本,b事務的更新是建立了乙個新版本來更新,不同事務的讀和寫是分離的

再來乙個例子來解釋一下幻讀問題:

mysql的四種事務隔離級別

csdn的序列圖排版有些問題,在電腦上影響不大

Mysql的ACID 事務併發 事務隔離級別

目錄 一 事務的基本要素 acid a atomicity,即原子性 c consistency,即一致性 i isolation,即隔離性 d durability,即永續性 二 事務的併發問題 1.髒讀 2.不可重複讀 3.幻讀 三 mysql的事務隔離級別 事務開始後的所有操作,要麼全部完成,...

事務的併發問題

1 髒讀 事務a讀取了事務b更新的資料,然後b回滾操作,那麼a讀取到的資料是髒資料 2 不可重複讀 事務 a 多次讀取同一資料,事務 b 在事務a多次讀取的過程中,對資料作了更新並提交,導致事務a多次讀取同一資料時,結果 不一致。3 幻讀 系統管理員a將資料庫中所有學生的成績從具體分數改為abcde...

Mysql事務,併發問題,鎖機制

1 什麼是事務 事務是一條或多條資料庫操作語句的組合,具備acid,4個特點。原子性 要不全部成功,要不全部撤銷 隔離性 事務之間相互獨立,互不干擾 一致性 資料庫正確地改變狀態後,資料庫的一致性約束沒有被破壞 永續性 事務的提交結果,將持久儲存在資料庫中 2 事務併發會產生什麼問題 1 第一類丟失...