MySQL 事務 隔離級別

2021-10-17 07:35:04 字數 1240 閱讀 4962

mysql 事務都是指在 innodb 引擎下,myisam 引擎是不支援事務的

資料庫事務指的是一組資料操作,事務內的操作要麼就是全部成功,要麼就是全部失敗,什麼都不做,只要有一步失敗,就要回滾所有操作。

事務具有原子性(atomicity)、一致性(consistency)、隔離性(isolation)、永續性(durability)四個特性,簡稱 acid,缺一不可。

髒讀指的是讀到了其他事務未提交的資料,未提交意味著這些資料可能會回滾,也就是可能最終不會存到資料庫中,也就是不存在的資料。讀到了並不一定最終存在的資料,這就是髒讀。

不可重複讀指的是在同一事務內,不同的時刻讀到的同一批資料可能是不一樣的,可能會受到其他事務的影響,比如其他事務改了這批資料並提交了。通常針對資料更新(update)操作。

幻讀是針對資料插入(insert)操作來說的。假設事務a對某些行的內容作了更改,但是還未提交,此時事務b插入了與事務a更改前的記錄相同的記錄行,並且在事務a提交之前先提交了,而這時,在事務a中查詢,會發現好像剛剛的更改對於某些資料未起作用,但其實是事務b剛插入進來的,讓使用者感覺很魔幻,感覺出現了幻覺,這就叫幻讀。

sql 標準定義了四種隔離級別,mysql 全都支援。這四種隔離級別分別是:

讀未提交(read uncommitted)

讀提交 (read committed)

可重複讀 (repeatable read)

序列化 (serializable)

從上往下,隔離強度逐漸增強,效能逐漸變差。採用哪種隔離級別要根據系統需求權衡決定,其中,可重複讀是 mysql 的預設級別。

下面展示了 4 種隔離級別對這三個問題的解決程度。

只有序列化的隔離級別解決了全部這 3 個問題,其他的 3 個隔離級別都有缺陷。

讀未提交和序列化基本上是不需要考慮的隔離級別,前者不加鎖限制,後者相當於單執行緒執行,效率太差。

讀提交解決了髒讀問題,行鎖解決了併發更新的問題。並且 mysql 在可重複讀級別解決了幻讀問題,是通過行鎖和間隙鎖的組合 next-key 鎖實現的。

事務的執行過程如下,以 begin 或者 start transaction 開始,然後執行一系列操作,最後要執行 commit 操作,事務才算結束。當然,如果進行回滾操作(rollback),事務也會結束。

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

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

MySQL事務隔離級別

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

Mysql 事務隔離級別

mysql 5.5預設儲存引擎 表型別 使用的是innodb,它是支援acid特性的 acid,指資料庫的原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 durability 乙個支援事務 transaction 的資料庫系統,必需要具有這四種特性,否...