在多用戶和網絡環境下,數據庫是一個共享資源,多個用戶或應用程序同時對數據庫的同一數據對象進行讀寫操作,這種現象稱為對數據庫的並發操作。顯然並發操作可以充分利用系統資源,提高系統效率。雖然如此,但是如果對並發操作不進行控制會造成一些錯誤。對並發操作進行的控制稱為並發控制。並發控制機制是衡量一個DBMS的重要性能指標之一。
10.1 事務及並發控制的基本概念
10.1.1 事務的概念
所謂事務是用戶定義的一個數據庫操作序列,這些操作要么全做要么全不做,是一個不可分割的工作單位。例如,在關系數據庫中,一個事務可以是一條SQL語句、一組SQL語句或整個程序。事務和程序是兩個概念。一般地講,一個程序中包含多個事務。
事務的開始與結束可以由用戶顯式定義。如果用戶沒有顯式地定義事務,則由DBMS按默認自動划分事務。在SQL語言中,定義事務的語句有三條:
BEGINTRANSACTION;
COMMIT;
ROLLBACK
事務通常是以BEGINTRANSACTION開始,以COMMIT或ROLLBACK結束。COMMIT的作用是提交,即提交事務的所有操作。事務提交是將事務中所有對數據的更新寫回到磁盤上的物理數據庫中去,事務正常結束。ROLLBACK的作用是回滾,即在事務運行的過程中發生了某種故障,事務不能繼續執行,系統將事務中對數據庫的所有已完成的操作全部撤消,回滾到事務開始時的狀態。
10.1.2 事務的特性
事務具有4個特性,即原子性、一致性、隔離性和持續性。
1.原子性(Atomicity):事務中包括的諸操作要么都做,要么都不做。也就是說,事務是作為一個整體單位被處理,不可以被分割。
2.一致性(Consistency):事務執行的結果必須使數據庫處於一個一致性狀態。當數據庫中只包含成功事務提交的結果時,就說數據庫處於一致性狀態。
如果數據庫系統運行中發生故障,有些事務尚未完成就被迫中斷,這些未完成事務對數據庫所做的修改有一部分已寫入物理數據庫,這時數據庫就處於一種不正確的狀態,或者說是不一致狀態,數據庫系統必須確保事務的一致性。
3.隔離性(1solation):一個事務的執行不能被其他事務干擾,即一個事務內部的操作及使用的數據對其他並發事務是隔離的,並發執行的各個事務之間不能互相干擾。
4.持續性(Durability)。持續性也稱永久性(Permanence)。持續性指一個事務一旦提交,它對數據庫中數據的改變就是永久性的,接下來的其他操作或故障不應該對其執行結果有任何影響。
事務的這些特性由數據庫管理系統中並發控制機制和恢復機制保障。
10.1.3 並發操作可能產生的問題
這里以庫存管理為例,說明對並發操作不加以限制,會產生數據不一致性問題,這種問題共有三類。
1. 丟失更新
假設某產品庫存量為50,現在購入該產品100個,執行入庫操作,庫存量加100;用掉40個,執行出庫操作,庫存量減40。分別用T1和T2表示入庫和出庫操作任務。
例如,同時發生入庫(T1)和出庫(T2)操作,這就形成並發操作。T1讀取庫存后,T2也讀取了同一個庫存;T1修改庫存,回寫更新后的值;T2修改庫存,也回寫更新后的值。此時庫存為T2回寫的值,T1對庫存的更新丟失。如表10.1所示T1和T2的並發操作執行順序,發生了“丟失更新”錯誤。
表10.1 發生丟失更新的過程
順序 |
任務 |
操作 |
庫存量 |
1 |
T1 |
讀庫存量 |
50 |
2 |
T2 |
讀庫存量 |
50 |
3 |
T1 |
庫存量=50+100 |
|
4 |
T2 |
庫存量=50-40 |
|
5 |
T1 |
寫庫存量 |
150 |
6 |
T2 |
寫庫存量 |
10 |
2. 讀“臟數據”
當T1和T2並發執行時,在T1對數據庫更新的結果沒有提交之前,T2使用了T1的結果,而在T2操作之后T1又回滾,這時引起的錯誤是T2讀取了T1的“臟數據”。表10.2所示的執行過程就產生了這種錯誤。
表10.2 T2使用T1的“臟數據”的過程
順序 |
任務 |
操作 |
庫存量 |
1 |
T1 |
讀庫存量 |
50 |
2 |
T1 |
庫存量=50+100 |
|
3 |
T1 |
寫庫存量 |
150 |
4 |
T2 |
讀庫存量 |
150 |
5 |
T2 |
庫存量=150-40 |
|
6 |
T1 |
ROLLBACK |
50 |
7 |
T2 |
寫庫存量 |
110 |
3. 不可重復讀
當T1讀取數據A后,T2執行了對A的更新,當T1 再次讀取數據A(希望與第一次是相同的值)時,得到的數據與前一次不同,這時引起的錯誤稱為“不可重復讀”。表10.3所示的並發操作執行過程,發生了“不可重復讀”錯誤。
並發操作之所以產生錯誤,是因為任務執行期間相互干擾造成的。當將任務定義成事務,事務具有的特性(特別是隔離性)得以保證時,就會避免上述錯誤的發生。但是,如果只允許事務串行操作會降低系統的效率。所以,多數DBMS采用事務機制和封鎖機制進行並發控制,既保證了數據的一致性,又保障了系統效率。
表10.3 T1對數據A“不可重復讀”的過程
順序 |
任務 |
操作 |
庫存量A |
入庫量B |
1 |
T1 |
讀A=50 |
50 |
100 |
2 |
T1 |
讀B=100 |
||
3 |
T1 |
求和=50+100 |
||
4 |
T2 |
讀B=100 |
50 |
|
5 |
T2 |
B←B×4 |
||
6 |
T2 |
回寫B=400 |
50 |
400 |
7 |
T1 |
讀A=50 |
50 |
|
8 |
T1 |
讀B=400 |
||
9 |
T1 |
和=450 (驗算不對) |
分析以上三種錯誤的原因,不難看出,上述三個操作序列違背了事務的四個特性。在產生並發操作時如何確保事務的特性不被破壞,避免上述錯誤的發生?這就是並發控制要解決的問題。
摘抄自:https://blog.csdn.net/xijiaoda_liuhao/article/details/8444000