原子性(atomicity):事務是乙個原子操作單元,其對資料的修改,要麼全都執行,要麼全都不執行。
一致性(consistent):在事務開始和完成時,資料都必須保持一致狀態。這意味著所有相關的資料規則都必須應用於事務的修改,以保持資料的完整性;事務結束時,所有的內部資料結構(如b樹索引或雙向鍊錶)也都必須是正確的。
隔離性(isolation):資料庫系統提供一定的隔離機制,保證事務在不受外部併發操作影響的「獨立」環境執行。這意味著事務處理過程中的中間狀態對外部是不可見的,反之亦然。
永續性(durable):事務完成之後,它對於資料的修改是永久性的,即使出現系統故障也能夠保持。
丟失更新
p欄位初始值為0,a事務開始後將p欄位+1,b事務未等待a事務提交也將p字段值更新並提交,a再事務提交,p最後的值是1,b的丟失更新,按照正常邏輯應該是a未提交時b先等待,a提交後b再開始事務並修改提交,此時的p應該為2。髒讀
乙個事務正在對一條記錄做修改,在這個事務完成並提交前,這條記錄的資料就處於不一致狀態;這時,另乙個事務也來讀取同一條記錄,如果不加控制,第二個事務讀取了這些「髒」資料,並據此做進一步的處理,就會產生未提交的資料依賴關係。這種現象被形象地叫做「髒讀」.,因為未提交的事務可能會回滾。不可重複讀
乙個事務在讀取某些資料後的某個時間,再次讀取以前讀過的資料,卻發現其讀出的資料已經發生了改變、或某些記錄已經被刪除了!這種現象就叫做「不可重複讀」。幻讀
乙個事務按相同的查詢條件重新讀取以前檢索過的資料,卻發現其他事務插入了滿足其查詢條件的新資料,這種現象就稱為「幻讀」。在上面講到的併發事務處理帶來的問題中,「更新丟失」應該是要完全避免的,執行事務時必須要鎖定對應的資料。
「髒讀」、「不可重複讀」和「幻讀」,其實都是資料庫讀一致性問題,必須由資料庫提供一定的事務隔離機制來解決。資料庫實現事務隔離的方式,基本上可分為以下兩種。
一種是在讀取資料前,對其加鎖,阻止其他事務對資料進行修改。
另一種是不用加任何鎖,通過一定機制生成乙個資料請求時間點的一致性資料快照(snapshot),這種技術叫做資料多版本併發控制(multiversion concurrency control,簡稱mvcc或mcc),也經常稱為多版本資料庫
像select lock in share mode(共享鎖), select for update ; update, insert ,delete(排他鎖)這些操作都是一種當前讀,為什麼叫當前讀?就是它讀取的是記錄的最新版本,讀取時還要保證其他併發事務不能修改當前記錄,會對讀取的記錄進行加鎖。
像不加鎖的select操作就是快照讀,即不加鎖的非阻塞讀;快照讀的前提是隔離級別不是序列級別,序列級別下的快照讀會退化成當前讀;之所以出現快照讀的情況,是基於提高併發效能的考慮,快照讀的實現是基於多版本併發控制,即mvcc,可以認為mvcc是行鎖的乙個變種,但它在很多情況下,避免了加鎖操作,降低了開銷;既然是基於多版本,即快照讀可能讀到的並不一定是資料的最新版本,而有可能是之前的歷史版本(此種情況下可避免幻讀,但如果當前事務中存在加鎖操作比如update操作,將仍然會出現幻讀)隔離級別
髒讀不可重複讀
幻讀未提交讀(read uncommitted)yy
y已提交讀(read committed)ny
y可重複讀(repeatable read)預設nn
y可序列化(serializable )nn
n
事務及事務隔離級別
什麼是事務 事務是訪問資料庫的乙個操作序列,資料庫應用系統通過事務集來完成對資料庫的訪問。事務的正確執行使得資料庫從一種狀態轉換為另一種狀態。事務必須服從iso iec所制定的acid原則。acid是原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 du...
事務及事務隔離級別
事務是訪問資料庫的乙個操作序列,資料庫應用系統通過事務集來完成對資料庫的訪問。事務的正確執行使得資料庫從一種狀態轉換為另一種狀態。事務必須服從iso iec所制定的acid原則。acid是原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 durabili...
事務及事務隔離級別
事務是訪問資料庫的乙個操作序列,資料庫應用系統通過事務集來完成對資料庫的訪問。事務的正確執行使得資料庫從一種狀態轉換為另一種狀態。事務必須服從iso iec所制定的acid原則。acid是原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 durabili...