事務
事務(Transaction)是用戶定義的一個數據庫操作序列,這些操作要麼全做,要麼全不做,是一個不可分割的工作單位。
事務是恢復和併發控制的基本單位。
事務和程序
在關係數據庫中,一個事務可以是一條SQL語句,一組SQL語句或整個程序。
一個程序通常包含多個事務。
COMMIT
事務正常結束
提交事務的所有操作(讀+更新)
事務中所有對數據庫的更新寫回到磁盤上的物理數據庫中
ROLLBACK
事務異常終止
事務運行的過程中發生了故障,不能繼續執行
系統將事務中對數據庫的所有已完成的操作全部撤銷
事務滾回到開始時的狀態
事務的特性(ACID)
恢復系統保證原子性和持久性。
併發控制系統保證隔離性和一致性。
原子性(Atomicity)
事務中包含的所有操作要麼全做,要麼全不做。
原子性由恢復系統實現。
一致性(Consistency)
事務執行的結果必須是使數據庫從一個一致性狀態變到另一個一致性狀態。
事務開始前,數據庫處於一致性的狀態;事務結束後,數據庫必須仍處於一致性狀態;事務的執行過程中可以暫時的不一致。
數據庫的一致性狀態由用戶來負責,由併發控制系統實現。
如銀行轉賬,轉賬前後兩個帳戶金額之和應保持不變。
兩種狀態:
一致性狀態
數據庫中只包含成功事務提交的結果。
不一致狀態
數據庫系統運行中發生故障,有些事務尚未完成就被迫中斷;
這些未完成事務對數據庫所做的修改有一部分已寫入物理數據庫,這時數據庫就處於一種不正確的狀態 。
隔離性(Isolation)
系統必須保證事務不受其它併發執行事務的影響。
對任何一對事務T1,T2,在T1看來,T2要麼在T1開始之前已經結束,要麼在T1完成之後再開始執行。
隔離性通過併發控制系統實現。
持久性(Durability)
一個事務一旦提交之後,它對數據庫的影響必須是永久的。系統發生故障不能改變事務的持久性。
持久性通過恢復系統實現。
併發操作帶來的不一致性
由於併發操作破壞了事務的隔離性。
1.丟失修改(Lost Update)
兩個事務T1和T2讀入同一數據並修改,T2的提交結果破壞了T1提交的結果,導致T1的修改被丟失。
2.不可重複讀(Non-repeatable Read)
不可重複讀是指事務T1讀取數據後,事務T2執行更新操作,使T1無法再現前一次讀取結果。
- 事務T1讀取某一數據後,事務T2對其做了修改,當事務T1再次讀該數據時,得到與前一次不同的值。
- 事務T1按一定條件從數據庫中讀取了某些數據記錄後,事務T2刪除了其中部分記錄,當T1再次按相同條件讀取數據時,發現某些記錄神祕地消失了。
- 事務T1按一定條件從數據庫中讀取某些數據記錄後,事務T2插入了一些記錄,當T1再次按相同條件讀取數據時,發現多了一些記錄。
後兩種不可重複讀有時也稱爲幻影現象(Phantom Row)
3.讀“髒”數據(Dirty Read)
讀“髒”數據是指:
事務T1修改某一數據,並將其寫回磁盤
事務T2讀取同一數據後,T1由於某種原因被撤銷
這時T1已修改過的數據恢復原值,T2讀到的數據就與數據庫中的數據不一致
T2讀到的數據就爲“髒”數據,即不正確的數據 。
以下部分內容來自於 數據庫系統概念
事務的隔離性按照隔離級別從低到高的順序:
1、未提交讀:
允許讀取未提交數據。
(當事務A更新某條數據時,不容許其他事務來更新該數據,但可以讀取。)
2、已提交讀:
只允許讀取已提交數據,但不要求可重複讀。
(當事務A更新某條數據時,不容許其他事務進行任何操作包括讀取,但事務A讀取時,其他事務可以進行讀取、更新。)
3、可重複讀:
只允許讀取已提交數據,而且一個事務兩次讀取一個數據項期間,其他事務不得更新該數據,但是該事務不要求與其他事務可串行化。
4、可串行化:
保證可串行化調度。
以上所有隔離級別都不允許髒寫,即如果一個數據項已經被另外一個尚未提交的事務寫入,則不允許對該數據項執行寫操作。
併發控制的主要技術
1、封鎖(Locking)
2、時間戳(Timestamp)
3、樂觀控制法
4、多版本併發控制(MVCC)
下面主要是封鎖機制:
封鎖就是事務T在對某個數據對象(例如表、記錄等)操作之前,先向系統發出請求,對其加鎖。
加鎖後事務T就對該數據對象有了一定的控制,在事務T釋放它的鎖之前,其它的事務不能更新此數據對象。
基本封鎖類型
- 排它鎖(Exclusive Locks,簡記爲X鎖)(寫鎖)
- 共享鎖(Share Locks,簡記爲S鎖)(讀鎖)
兩段鎖協議
“兩段”鎖的含義
事務分爲兩個階段:
1、第一階段是獲得封鎖,也稱爲擴展階段
事務可以申請獲得任何數據項上的任何類型的鎖,但是不能釋放任何鎖。
2、第二階段是釋放封鎖,也稱爲收縮階段
事務可以釋放任何數據項上的任何類型的鎖,但是不能再申請任何鎖。
封鎖粒度
封鎖對象的大小稱爲封鎖粒度(Granularity)
封鎖的對象爲邏輯單元,物理單元 。
在關係數據庫中,封鎖對象:
邏輯單元: 屬性值、屬性值的集合、元組、關係、索引項、整個索引、整個數據庫等。
物理單元:頁(數據頁或索引頁)、物理記錄等。
封鎖粒度與系統的併發度和併發控制的開銷密切相關。
- 封鎖的粒度越大,數據庫所能夠封鎖的數據單元就越少,併發度就越小,系統開銷也越小。
- 封鎖的粒度越小,併發度較高,但系統開銷也就越大。