數據庫的ACID特性詳解

數據庫的ACID特性詳解

我們在大學中學到的數據庫基本理論中,是指由一系列連續的數據庫操作組成的一個完整的邏輯過程。事務(Transaction)是併發控制的基本單位。所謂事務,它是一個操作序列,這些操作要麼都執行,要麼都不執行,它是一個不可分割的工作單位。

1、數據庫事務在 數據庫管理系統(DBMS)中,必須具備ACID特性,ACID是Atomic(原子性)、Consistency(一致性)、Isolation(隔離性)和Durability(持久性)的英文縮寫。

1)原子性(Atomicity)

事務的原子性指的是,一個事務(transaction)中的所有操作,要麼全部完成,要麼全部不完成,不會結束在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。

2)一致性(Consistency)

事務的一致性指的是,在一個事務執行之前和執行之後數據庫都必須處於一致性狀態。如果事務成功地完成,那麼系統中所有變化將正確地應用,系統處於有效狀態。如果在事務中出現錯誤,那麼系統中的所有變化將自動地回滾,系統返回到原始狀態。

3)隔離性(Isolation)

事務的隔離性指的是,在併發環境中,隔離性是指兩個事務之間互不干擾。由併發事務所做的修改必須與任何其他併發事務所做的修改隔離。事務查看數據更新時,數據所處的狀態要麼是另一事務修改它之前的狀態,要麼是另一事務修改它之後的狀態,事務不會查看到中間狀態的數據。

4)持久性(Durability)

事務的持久性指的是,只要事務成功結束,它對數據庫所做的更新就必須永久保存下來。即使發生系統崩潰,重新啓動數據庫系統後,數據庫還能恢復到事務成功結束時的狀態。

事務的四個隔離級別:

1)未提交讀(Read Uncommitted):
SELECT語句以非鎖定方式被執行,所以有可能讀到髒數據,隔離級別最低。(讀不鎖)

2)提交讀(Read Committed):
只能讀取到已經提交的數據。即解決了髒讀,但未解決不可重複讀。(讀鎖,等寫完)

3)可重複讀(Repeated Read):
在同一個事務內的查詢都是事務開始時刻一致的,InnoDB的默認級別。在SQL標準中,該隔離級別消除了不可重複讀,但是還存在幻讀。(寫鎖,等讀完)

4)串行讀(Serializable):
完全的串行化讀,所有SELECT語句都被隱式的轉換成SELECT … LOCK IN SHARE MODE,即讀取使用表級共享鎖,讀寫相互都會阻塞。隔離級別最高。

事務併發問題

1)髒讀(Dirty Reads):
事務A讀取了事務B的更新的數據,但是事務B回滾了,導致A讀取的爲髒數據。

2)不可重複讀(Non-Repeatable Reads):
事務A讀取同一數據兩次,但是在兩次之間事務B對該數據進行了修改並提交,導致事務A讀取兩次讀取不一致。

3)幻讀(Phantom Reads):
事務A修改全表的數據,在未提交時,事務B向表中插入或刪除數據,導致事務A讀取的數據與需要修改的數據不一致。

PS: 不可重複讀針對的時數據的修改,幻讀針對的時數據的新增和刪除。解決不可重複讀問題只需要給對應記錄上行鎖,而解決幻讀需要對錶加鎖

隔離級別導致事務併發問題

在這裏插入圖片描述

實現事物隔離性主要有兩種方式

隔離的實現主要有讀寫鎖和MVCC(Multi-Version Concurrency Control)多版本併發處理方式

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章