1. 程式人生 > >數據庫原理-事務基本概念

數據庫原理-事務基本概念

串行化 就是 zab 數據頁 數據庫的操作 mit 關系 升級 進行

2018-1-9 by Atlas

  • 數據庫訪問

read(X):把數據X,從磁盤的數據庫中讀到內存的緩沖區中。
write(X):把數據X,從內存的緩存區寫回磁盤的數據庫。

  • ACID性質

1、原子性(Atomicity)
一個事務對數據的所有操作,是一個不可分割的工作單元。這些操作要麽全部執行,要麽什麽也不做(就對DB的效果而言)。
保證原子性是數據庫系統本身的職責,由DBMS的事務管理子系統實現。
2、一致性(Consistency)
一個事務獨立執行的結果,應保持數據庫的一致性,即數據不會因事務的執行而遭受破壞。
確保單個事務的一致性是編寫事務的應用程序員的職責,在系統運行時,由DBMS的完整性子系統執行測試任務。

3、隔離性(Isolation)
在多個事務並發執行時,系統應保證與這些事務先後單獨執行時的結果一樣,此時稱事務達到了隔離性的要求。也就是在多個事務並發執行時,保證執行結果是正確的,如同單用戶環境一樣。
隔離性是由DBMS的並發控制子系統實現的。
4、持久性(Durability)
一個事務一旦完成全部操作後,它對數據庫的所有更新應永久地反映在數據庫中,不會丟失。即使以後系統發生故障,也是如此。
持久性由DBMS的恢復管理子系統實現的。

  • 檢查點技術

REDO(重做)和UNDO(撤銷)處理,實際上是采用檢查點(Checkpoint)方法實現的。
兩次檢查點和其中間故障點把事務分為五類:
T1:事務到達第一次檢查點前已經完成。

T2:事務在第一次檢查點前開始直到故障點前已經完成。
T3:事務在第一次檢查點前開始直到故障點沒有完成。
T4:事務在第一次檢查點後開始直到故障點前已經完成。
T5:事務在第一次檢查點後開始直到故障點沒有完成。
故障處理:

  • 事務T1不必恢復。因為它們的更新已經在第一次檢查點時寫到數據庫中了。
  • 事務T2和事務T4必須重做(REDO)。因為它們結束在下一個檢查點之前。它們對DB的修改仍在內存緩沖區,還未寫到磁盤。
  • 事務T3和事務T5必須撤銷(UNDO)。因為它們還未做完,必須撤銷事務已對DB作的修改。

  • 數據庫並發操作問題

  • 丟失更新問題:
    數據庫中A的初值是100,事務T1對A的值減30,事務T2對A的值增加1倍。如果執行次序是先T1後T2,那麽結果A的值是140。如果先執行T2後T1,那麽A的值是170。這兩種情況都應該是正確的。但事務T1讀A的值執行中事務T2也讀A的值執行,先執行完的事務更新的值被後執行完的事務更新的值覆蓋,結果丟失了先執行完的事務對數據庫的更新操作。因而這個並發操作是不正確的。
  • 讀臟數據問題:
    (1)數據庫中A的初值是100,事務T1把A的值修改為70,但尚未提交(即未做COMMIT操作),事務T2緊跟著讀未提交的A值(70)。隨後,事務T1做ROLLBACK操作,把A的值恢復為100。而事務T2仍在使用被撤銷了的A值(70)。在數據庫技術中,把未提交的隨後被撤銷的數據稱為“臟數據”。
    (2)數據庫中A的初值是100,事務T1把A的值修改為70,但尚未提交(即未做COMMIT操作),事務T2緊跟著讀未提交的A值(70)。事務T2對A的值增加1倍,執行完的事務T2對數據庫作更新操作。隨後,事務T1做ROLLBACK操作,把A的值恢復為100。結果丟失了事務T2對數據庫的更新操作。破壞了數據庫的完整性。
  • 不可重復讀問題:
    數據庫中A的初值是100,事務T1需要兩次讀取同一數據項A,但是在兩次讀操作的間隔中,另一個事務T2改變了A的值。因此,T1在兩次讀同一數據項A時卻讀出了不同的值。

  • 封鎖技術

鎖(Lock)是一個與數據項相關的變量,對可能應用於該數據項上的操作而言,鎖描述了該數據項的狀態。
通常在數據庫中每個數據項都有一個鎖。鎖的作用是使並發事務對數據庫中數據項的訪問能夠同步。封鎖技術中主要有兩種封鎖:排他型封鎖和共享型封鎖。

  • 排他型封鎖(X鎖):
    Exclusive Lock 簡稱X鎖,又稱寫鎖。
    定義:如果事務T對某個數據R(可以是數據項、記錄、數據集乃至整個數據庫)實現了X鎖,那麽在T對數據R解除封鎖之前,不允許其他事務T再對該數據加任何類型的鎖。這種鎖稱為“X鎖”。
    使用X鎖的操作有兩個:
    (1)申請X鎖操作“XFIND R”:表示事務對數據R申請加X鎖,若成功,則可以讀或寫數據R;如果不成功,那麽這個事務將進入等待隊列,一直到獲準X鎖,事務才能繼續做下去。
    (2)解除X鎖操作“XRELEASE R”:表示事務要解除對數據R的X鎖。
    在一個事務對數據加上X鎖後,並且對數據進行了修改,如果過早地解鎖,有可能使其他事務讀了未提交數據(且隨後被回退),引起丟失其他事務的更新。為了解決這個問題,X鎖的解除操作應該合並到事務的結束(COMMIT或ROLLBACK)操作中。也就是系統中沒有解除X鎖操作的語句,在COMMIT語句和ROLLBACK語句中包含了解除X鎖的操作。
  • 共享型封鎖(S鎖):
    Shared Lock 簡稱S鎖,又稱讀鎖。
    定義:如果事務T對某數據加上S鎖後,仍允許其他事務再對該數據加S鎖,但在對數據的所有S鎖都解除之前決不允許任何事務對該數據加X鎖。
    使用S鎖的操作有三個:
    (1)申請S鎖操作“SFIND R”:表示事務對數據R申請加S鎖,若成功,則可以讀數據R,但不可以寫數據R;如果不成功,那麽這個事務將進入等待隊列,一直到獲準S鎖,事務才能繼續做下去。
    (2)升級和寫操作“UPDX R”:表示事務要把對數據R的S鎖升級為X鎖,若成功則更新數據R,否則這個事務進入等待隊列。
    (3)解除S鎖操作“SRELEASE R”:表示事務要解除對數據R的S鎖。
    可以看出,獲準S鎖的事務只能讀數據,不能更新數據,若有更新,則先要把S鎖升級為X鎖。另外,由於S鎖只允許讀數據,因此解除S鎖的操作不必要合並到事務的結束操作中去,可以隨時根據需要解除S鎖。
  • 封鎖粒度:
    定義:封鎖對象的大小稱為封鎖粒度。
    封鎖的對象可以是邏輯單元,也可以是物理單元。在數據庫中,封鎖對象可以是屬性值、屬性值集合、元組、關系、索引項、整個索引、整個數據庫等邏輯單元;也可以是頁(數據頁或索引頁)、塊等物理單元。
    封鎖粒度與系統的並發度和並發控制的開銷密切相關。封鎖的粒度越大,並發度也就越小,但同時系統的開銷也就越小;相反,封鎖的粒度越小,並發度越高,但系統的開銷也就越大。

  • 事務的存取模式

(1)READ ONLY(只讀型):事務對數據庫的操作只能是讀操作。定義這個模式後,表示隨後的事務均是只讀型。
(2)READ WRITE(讀寫型):事務對數據的操作可以是讀操作,也可以是寫操作。定義這個模式後,表示隨後的事務均是讀寫型。在程序開始時默認這種模式。

  • 事務的隔離級別

(1)SERIALIZEABLE(可串行化):允許事務與其他事務並發執行,但系統必須保證並發調用是可串行化,不致發生錯誤。
(2)REPEATABLE READ(可重復讀):只允許事務讀已提交的數據,並且在兩次讀同一數據時不允許其他事務修改此數據。
(3)READ COMMITTED(讀提交數據):允許事務讀已提交的數據,但不要求“可重復讀”。
(4)READ UNCOMMITTED(可以讀未提交數據):允許事務讀已提交或未提交的數據。

  • 語句定義:
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
    SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
    SET TRANSACTION ISOLATION LEVEL READ COMMITTED
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

摘抄自:《數據庫原理》

數據庫原理-事務基本概念