什麼是事務?事務的四個特徵(ACID)
一、什麼是事務?
事務(Transaction)是訪問並可能更新資料庫中各項資料項的一個程式執行單元(unit)。事務由事務開始(begin transaction)和事務結束(end transaction)之間執行的全體操作組成。
事務是一個不可分割的資料庫操作序列,也是資料庫併發控制的基本單位,其執行的結果必須使資料庫從一種一致性狀態變到另一種一致性狀態。
事務結束有兩種,事務中的步驟全部成功執行時,提交事務。如果其中一個失敗,那麼將會發生回滾操作,並且撤銷之前的所有操作。也就是說,事務內的語句,要麼全部執行成功,要麼全部執行失敗。
事務是恢復和併發控制的基本單位。
事務具有四個特徵:原子性、一致性、隔離性和永續性
二、事務的四個特徵(ACID)
原子性(Atomicity)
原子性是指事務是一個不可分割的工作單位,整個事務中的所有操作要麼全部提交成功,要麼全部失敗回滾,對於一個事務來說,不可能只執行其中的一部分操作。
一致性(Consistency)
一致性是指事務必須使資料庫從一個一致性狀態變換到另一個一致性狀態。
也就是說事務前後資料的完整性必須保持一致。
隔離性(Isolation)
隔離性是指一個事務的執行不能有其他事務的干擾,事務的內部操作和使用資料對其他的併發事務是隔離的,互不干擾。
永續性(Durability)
永續性是指一個事務一旦提交,對資料庫中資料的改變就是永久性的。此時即使資料庫發生故障,修改的資料也不會丟失。接下來其他的操作不會對已經提交了的事務產生影響。
三、什麼是髒讀、不可重複讀、幻讀?
髒讀
髒讀是指在一個事務處理過程裡讀取了另一個未提交的事務中的資料。
比如在事務 A 修改資料之後提交資料之前,這時另一個事務 B 來讀取資料,如果不加控制,事務 B 讀取到 A 修改過資料,之後 A 又對資料做了修改再提交,則 B 讀到的資料是髒資料,此過程稱為髒讀。
不可重複讀
不可重複讀是指在資料庫訪問中,一個事務範圍內多次查詢卻返回了不同的資料值。這是由於在查詢間隔中,其他事務修改並提交而引起的。
比如事務 T1 讀取某一資料,事務 T2 讀取並修改了該資料,T1 為了對讀取值進行檢驗而再次讀取該資料,便得到了不同的結果。
幻讀
幻讀是指當事務不是獨立執行時發生的一種現象,例如第一個事務對一個表中的資料進行了修改,比如這種修改涉及到表中的“全部資料行”。
比如事務 A 在按查詢條件讀取某個範圍的記錄時,事務 B 又在該範圍內插入了新的滿足條件的記錄,當事務 A 再次按條件查詢記錄時,會產生新的滿足條件的記錄。
四、SQL的四個隔離級別
未提交讀(Read Uncommitted)
一個事務能夠讀取到別的事務中沒有提交的更新資料。事務中的修改,即使沒有提交,其他事務也可以看得到。在這種隔離級別下有可能發生髒讀,不可重複讀和幻讀。
提交讀(Read Committed)
事務中的修改只有提交以後才能被其它事務看到。在這種隔離級別下解決了髒讀,但是有可能發生不可重複讀和幻讀。
可重複讀(Repeated Read)
保證了在同一事務中先後執行的多次查詢將返回同一結果,看到的每行的記錄的結果是一致的,不受其他事務的影響。但是這種級別下有可能發生幻讀。
可序列化(Serializable)
不允許事務併發執行,強制事務序列執行。就是在讀取的每一行資料上都加上了鎖,讀寫相互都會阻塞,所以效率很低下。這種隔離級別最高,是最安全的,但是效能最低,不會出現髒讀,不可重複讀,幻讀。
隔離級別 | 髒讀 | 不可重複讀 | 幻讀 |
---|---|---|---|
Read Uncommitted | YES | YES | YES |
Read Committed | NO | YES | YES |
Repeated Read | NO | NO | YES |
Serializable | NO | NO | NO |