mysql ACID與四種隔離級別歸納總結


關於數據庫的ACID特性已經有很多的介紹,這里再重新歸納總結一下:
 
A(atomicity)原子性:
  即事務要么全部做完,要么全部不做,不會出現只做一部分的情形,如A給B轉帳,不會出現A的錢少了,B的錢卻沒有增加的情況
C(consistency)一致性:
  指的是事務從一個狀態到另一個狀態是一致的,如A減少了100,B不可能只增加30。
I(isolation)隔離性:
  即一個事務在沒有完成數據的提交修改時,對其它事務是不可見的。當然這里有個隔離級別的概念,在不同隔離級別下,這里會有不同的表現形式
D(durability)持久性:
  一旦事務提交,則所做修改就會被永久保存到數據庫中。
 
 
在說隔離級別之前,我們先說如下幾個概念:
臟讀:
  一個事務對數據進行增刪改,但並沒有提交,但另一事務卻能讀到未提交的數據
不可重復讀:
  一事務對數據進行了 更新或刪除操作,另一事務兩次查詢的數據不一致
幻讀:
  一事務對數據進行了 新增操作,另一事務兩次查詢結果不一致。
 
我們看到不可重復讀與幻讀好像好類似,但其實它們是有很大的不同, 不可重復讀主要體現在update與delete,而幻讀主要體現在insert,從實現層面上講,要解決不可重復讀,我們只需要對查詢的數據進行加鎖就可以實現,此時update與delete這些行都會阻塞等待,但是insert依舊可以,避免不了幻讀,而要解決幻讀,必須對其行與行之前也加鎖,在mysql中,是通過next key lock(行鎖+gap lock)來實現的。
 
 
隔離級別:
read uncommited未提交讀:
  隔離級別為0,會有臟讀,不可重復讀,幻讀
 
read commit提交讀:
  隔離級別為1,不會有臟讀,但有不可重復讀,幻讀
 
repeatable read可重復讀:
  隔離級別為2,不會有臟讀,不可重復讀,但依舊會有幻讀。但為什么說mysql中的repeatable read解決了幻讀?本來是會有幻讀的,但是 它采用了next key lock加上for update來避免,InnoDB提供了這樣一種機制,通過加鎖去查詢可以得到最新的數據,如兩個事務同時開啟,A事務插入了一條數據,並提交,B事務去查select * from t,此時B是不能查詢到A事務提交的數據的,但是加多一個for update,即select * from t for update,就能查找剛剛A事務插入的數據。所以我們才說mysql在repeatable read隔離級別下可以避免幻讀的原因,記得加for update。
 
serializable可序列化:
  隔離級別為3,不會有臟讀,不可重復讀,幻讀。但效率最低,並發性能最差,一般情況下不會使用。
 
 
 
 
 
 


免責聲明!

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



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