事務的定義
事務是由一組SQL語句組成的邏輯處理單元,事務具有以下4個屬性,通常簡稱為事務的ACID屬性。
經典案例
事務最經典也經常被拿出來說例⼦就是轉賬了。假如⼩明要給⼩紅轉賬1000元,這個轉賬會涉及 到兩個關鍵操作就是:將⼩明的余額減少1000元,將⼩紅的余額增加1000元。萬⼀在這兩個操 作之間突然出現錯誤⽐如銀⾏系統崩潰,導致⼩明余額減少⽽⼩紅的余額沒有增加,這樣就不對 了。事務就是保證這兩個關鍵操作要么都成功,要么都要失敗。
事物的四⼤特性(ACID)
- 原子性(Atomicity):事務是一個原子操作單元,其對數據的修改,要么全都執行,要么全都不執行。
- 一致性:(Consistent):在事務開始和完成時,數據都必須保持一致狀態,這意味着所有相關的數據規則都必須應用於事務的修改,以保持數據的完整性;事務結束時,所有的內部數據結構(如B樹索引或雙向鏈表)也都必須是正確的。
- 隔離性(Isolation):數據庫系統提供一定的隔離機制,保證事務在不受外部並發操作影響的“獨立”環境執行。這意味着事務處理過程中的中間狀態對外部是不可見的,反之亦然。
- 持久性(Durable):事務完成之后,它對於數據的修改是永久性的,即使出現系統故障也能夠保持。
並發事務帶來的四大問題
在典型的應⽤程序中,多個事務並發運⾏,經常會操作相同的數據來完成各⾃的任務(多個⽤戶 對同⼀數據進⾏操作)。並發雖然是必須的,但可能會導致以下的問題
- 臟讀(Dirty Reads):當⼀個事務正在訪問數據並且對數據進⾏了修改,⽽這種修改還沒有提 交到數據庫中,這時另外⼀個事務也訪問了這個數據,然后使⽤了這個數據。因為這個數據 是還沒有提交的數據,那么另外⼀個事務讀到的這個數據是“臟數據”,依據“臟數據”所做的 操作可能是不正確的。
- 更新丟失(Lost Update):: 指在⼀個事務讀取⼀個數據時,另外⼀個事務也訪問了該數據,那么在第⼀個事務中修改了這個數據后,第⼆個事務也修改了這個數據。這樣第⼀個事 務內的修改結果就被丟失,因此稱為丟失修改。 例如:事務1讀取某表中的數據A=20,事 務2也讀取A=20,事務1修改A=A-1,事務2也修改A=A-1,最終結果A=19,事務1的修改被丟失。
- 不可重復讀(Non-Repeatable Reads):一個事務在讀取某些數據后的某個時間,再次讀取以前讀過的數據,卻發現其讀取出的數據已經發生了改變,或某些記錄已經被刪除了!這種現象叫做“不可重復讀”。一句話:事務A讀取到了事務B已經提交的修改數據,不符合隔離性。
- 幻讀(Phantom):幻讀與不可重復讀類似。它發⽣在⼀個事務(T1)讀取了⼏⾏數 據,接着另⼀個並發事務(T2)插⼊了⼀些數據時。在隨后的查詢中,第⼀個事務(T1) 就會發現多了⼀些原本不存在的記錄,就好像發⽣了幻覺⼀樣,所以稱為幻讀。