天天看點

mysql事務隔離級别

Transaction Isolation Levels

InnoDB支援SQL1992标準中的四種隔離級别:READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZABLE。預設的隔離級别是REPEATABLE READ。

通過SET TRANSACTION指令可以改變預設的隔離級别,為了讓這種改變對所有使用者的所有連接配接都生效,需要加上--transaction-isolation選項。

InnoDB通過不同的加鎖政策來實作不同的隔離級别

REPEATABLE READ

這是InnoDB預設的隔離級别。在一個事務中,一緻讀會讀到該事務中第一次讀到的那個快照。這就意味着,在同一個事務中多次執行普通的SELECT語句傳回的結果是一緻的。

對于加鎖讀(SELECT ... FOR UPDATE或者SELECT ... LOCK IN SHARE MODE)、更新、删除語句,鎖取決于語句是否使用了唯一索引或者範圍類的檢索條件。

  • 對于用唯一索引作為檢索條件,InnoDB隻會鎖發現的索引記錄,而不會鎖它前面的間隙
  • 對于其它的檢索條件,InnoDB鎖定掃描的索引範圍,用間隙鎖或者next-key鎖來阻塞其它會話向這個範圍内的間隙中插入資料
mysql事務隔離級别
mysql事務隔離級别

參考 https://dev.mysql.com/doc/refman/5.7/en/innodb-transaction-isolation-levels.html

 事務的特性

  • 原子性:事務中的操作要麼全部成功,要麼全部失敗
  • 一緻性:事務操作必須是将資料庫從一個一緻性狀态帶到另一個一緻性狀态。所謂一緻指的是,比如轉賬,A和B都有100元,轉賬之前總共是200元,轉賬之後必須也是200元
  • 隔離性:事務之間不會互相影響
  • 持久性:事務送出以後對資料庫所做的改變将永久儲存下來

事務并發帶來的問題

  • 髒讀:一個事務讀到另一個事務未送出的資料
  • 幻讀:一個事務讀到另一個事務已送出的資料,然而這種送出的資料涉及到整個表,比如插入和删除,看起來好像幻覺一樣
  • 不可重複讀:一個事務中多次讀取同一個資料傳回的結果不一樣

事務隔離級别

  • 讀未送出:允許一個事務看到另一個事務沒有送出的資料
  • 讀已送出:允許一個事務看到另一個事務已送出的資料
  • 可重複讀:同一個事務中多次讀取看到的資料始終一緻
  • 串行化:并發事務串行執行

繼續閱讀