1、什么是事務
事務是並發控制的單位,一系列操作組成的工作單元,該工作單元內的操作是不可分割的,也就是事務具有原子性,一個事務中的一系列的操作要么全部成功,要么一個都不做,所有操作必須成功完成,否則在每個操作中所作的所有更改都會被撤消。
事務的結束有兩種,當事務中的所以步驟全部成功執行時,事務提交。如果其中一個步驟失敗,將發生回滾操作,撤消撤消之前到事務開始時的所以操作。
2、事務的 ACID
事務具有四個特征:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)和持續性(Durability)。這四個特性簡稱為 ACID 特性。
1)原子性(Atomicity)
事務是數據庫的邏輯工作單位,事務中包含的各操作要么都做,要么都不做
2) 一致性(Consistency)
事務執行的結果必須是使數據庫從一個一致性狀態變到另一個一致性狀態。
當數據庫只包含成功事務提交的結果時,就說數據庫處於一致性狀態。假如數據庫系統運行中發生故障,有些事務尚未完成就被迫中斷,這些未完成事務對數據庫所做的修改有一部分已寫入物理數據庫,這時數據庫就處於一種不(Isolation)
一個事務的執行不能其它事務干擾。一個事務內部的操作及使用的數據對其它並發事務是隔離的,並發執行的各個事務之間不能互相干擾。
4) 持續性(Durability)
持續性也稱永久性,是指一個事務一旦提交,它對數據庫中的數據的改變就應該是永久性的。接下來的其它操作或故障不應該對其執行結果有任何影響。
在平常的項目開發里數據庫操作一般都是並發執行的,即有多個事務並發執行,數據庫事務並發帶來的問題有:
1、丟失更新:兩個事務同時更新一行數據,最后一個事務的更新會覆蓋掉第一個事務的更新,從而導致第一個事務更新的數據丟失,這是由於沒有加鎖造成的;
第一類丟失更新
時間片 | 消費事務A | 充值事務B |
---|---|---|
T1 | 開始事務 | |
T2 | 開始事務 | |
T3 | 查詢賬戶余額500元 | |
T4 | 查詢余額為500元 | |
T5 | 充值200元,更改余額為700元 | |
T6 | 提交事務 | |
T7 | 消費100元把余額改為400元 | |
T8 | 撤銷事務 | |
T9 | 余額恢復為500元 |
消費事務A在事務撤銷時,將充值事務B已經充值的200元給弄丟失了。
第二類丟失更新
時間片 | 消費事務A | 充值事務B |
---|---|---|
T1 | 開始事務 | |
T2 | 開始事務 | |
T3 | 查詢賬戶余額500元 | |
T4 | 查詢余額為500元 | |
T5 | 消費100元,更改余額為400元 | |
T6 | 提交事務 | |
T7 | 余額為400元 | 充值200元,更改余額為700元 |
T8 | 提交事務 | |
T9 | 余額為700元 |
消費事務A在消費100元后更新數據庫,而充值事務B給賬戶充值200元更改余額為700元,將消費的100元給弄丟失了。
2、臟讀:一個事務看到了另一個事務未提交的更新數據;當事務讀取尚未提交的數據時,就會發生這種情況。
例如事務A正在訪問數據,並且對數據進行了修改,更改了一行數據,這種修改還沒有提交到數據庫中,而事務B在事務A提交更新之前讀取了已更新的行,然后使用了這個數據。
如果事務A回滾該更新,則事務B使用的這個數據由於還沒有提交,就會被認為是不曾存在的數據,即為臟數據,根據臟數據所做的操作可能是不正確的。
3、 不可重復讀:在同一事務中,兩次讀取同一數據,得到內容不同,也就是有其他事務更改了這些數據;
例如事務A查詢一條記錄后,事務B更新了事務A查詢的記錄,並提交了事務,那事務A再次查詢上次的記錄時,對同一數據查詢了兩次,得到的結果不同,這稱為不可重復讀。
4、幻讀:一個事務在執行過程中讀取到了另一個事務已提交的插入數據;即在第一個事務開始時讀取到一批數據,但此后另一個事務又插入了新數據並提交,此時第一個事務又讀取這批數據但發現多了一條,即好像發生幻覺一樣。