mysql 隔離性與隔離級別


提到事務,你肯定不陌生,和數據庫打交道的時候,我們總是會用到事務。最經典的例子就是轉賬,你要給朋友小王轉 100 塊錢,而此時你的銀行卡只有 100 塊錢。

轉賬過程具體到程序里會有一系列的操作,比如查詢余額、做加減法、更新余額等,這些操作必須保證是一體的,不然等程序查完之后,還沒做減法之前,你這 100 塊錢,完全可以借着這個時間差再查一次,然后再給另外一個朋友轉賬,如果銀行這么整,不就亂了么?這時就要用到“事務”這個概念了。

簡單來說,事務就是要保證一組數據庫操作,要么全部成功,要么全部失敗。在 MySQL 中,事務支持是在引擎層實現的。你現在知道,MySQL 是一個支持多引擎的系統,但並不是所有的引擎都支持事務。比如 MySQL 原生的 MyISAM 引擎就不支持事務,這也是 MyISAM 被 InnoDB 取代的重要原因之一。

隔離性與隔離級別

提到事務,你肯定會想到 ACID(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔離性、持久性),今天我們就來說說其中 I,也就是“隔離性”。

當多事務同時執行的時候,可能會出現的問題:臟讀、不可重復讀、幻讀

  • 臟讀:
    當數據庫中一個事務A正在修改一個數據但是還未提交或者回滾,
    另一個事務B 來讀取了修改后的內容並且使用了,
    之后事務A提交了,此時就引起了臟讀。

此情況僅會發生在: 讀未提交的的隔離級別.

  • 不可重復讀:
    在一個事務A中多次操作數據,在事務操作過程中(未最終提交),
    事務B也才做了處理,並且該值發生了改變,這時候就會導致A在事務操作
    的時候,發現數據與第一次不一樣了。 就是不可重復讀。

此情況僅會發生在:讀未提交、讀提交的隔離級別.

  • 幻讀:
    一個事務按相同的查詢條件重新讀取以前檢索過的數據,
    卻發現其他事務插入了滿足其查詢條件的新數據,這種現象就稱為幻讀。

幻讀是指當事務不是獨立執行時發生的一種現象,例如第一個事務對一個表中的數據進行了修改,比如這種修改涉及到表中的“全部數據行”。同時,第二個事務也修改這個表中的數據,這種修改是向表中插入“一行新數據”。那么,以后就會發生操作第一個事務的用戶發現表中還存在沒有修改的數據行,就好象發生了幻覺一樣.
一般解決幻讀的方法是增加范圍鎖RangeS,鎖定檢索范圍為只讀,這樣就避免了幻讀。

此情況會回發生在:讀未提交、讀提交、可重復讀的隔離級別.

事務隔離級別:讀未提交、讀提交、可重復讀、串行化

不同事務隔離級別的區別:

  1. 讀未提交:一個事務還未提交,它所做的變更就可以被別的事務看到
  2. 讀提交:一個事務提交之后,它所做的變更才可以被別的事務看到
  3. 可重復讀:一個事務執行過程中看到的數據是一致的。未提交的更改對其他事務是不可見的
  4. 串行化:對應一個記錄會加讀寫鎖,出現沖突的時候,后訪問的事務必須等前一個事務執行完成才能繼續執行

其實另一種理解就是

  1. 讀未提交:別人改數據的事務尚未提交,我在我的事務中也能讀到。
  2. 讀已提交:別人改數據的事務已經提交,我在我的事務中才能讀到。
  3. 可重復讀:別人改數據的事務已經提交,我在我的事務中也不去讀。
  4. 串行:我的事務尚未提交,別人就別想改數據。

這4種隔離級別,並行性能依次降低,安全性依次提高。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM