日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

数据库事务的概念及其实现原理

發(fā)布時間:2024/7/23 数据库 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据库事务的概念及其实现原理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

  • 1. 認識事務
    • 1.1 為什么需要數(shù)據(jù)庫事務
    • 1.2 什么是數(shù)據(jù)庫事務
    • 1.3 事務如何解決問題
    • 1.4 事務的ACID特性以及實現(xiàn)原理概述
  • 2.并發(fā)異常與并發(fā)控制技術(shù)
    • 2.1 常見的并發(fā)異常
    • 2.2 事務的隔離級別
    • 2.3 事務隔離性的實現(xiàn)——常見的并發(fā)控制技術(shù)
      • 2.3.1 基于封鎖的并發(fā)控制
      • 2.3.2 基于時間戳的并發(fā)控制
      • 2.3.3 基于有效性檢查的并發(fā)控制
      • 2.3.4 基于快照隔離的并發(fā)控制
      • 2.3.5 關(guān)于并發(fā)控制技術(shù)的總結(jié)
  • 3. 故障與故障恢復技術(shù)
    • 3.1 為什么需要故障恢復技術(shù)
    • 3.2 事務的執(zhí)行過程以及可能產(chǎn)生的問題
    • 3.3 日志的種類和格式
    • 3.4 日志恢復的核心思想
    • 3.5 事務故障中止/正常回滾的恢復流程
    • 3.6 系統(tǒng)崩潰時的恢復過程(帶檢查點)
      • 3.6.1 一個系統(tǒng)崩潰恢復的例子
  • 4. 總結(jié)
  • 5. 參考資料


事務是數(shù)據(jù)庫系統(tǒng)中的重要概念,了解這一概念是以正確的方式開發(fā)和數(shù)據(jù)庫交互的應用程序的前提。但是很多開發(fā)者對于事務的認識相對片面和膚淺,僅僅把它等同于ACID,不了解數(shù)據(jù)庫系統(tǒng)引入事務的真正動機,ACID對于事務意味著什么以及最重要的:數(shù)據(jù)庫系統(tǒng)是如何保證事務的ACID特性的?
因為最近在導師手下做一個微服務和分布式事務相關(guān)的課題項目,作為必要的前置準備,需要加深下對單機事務的認識并理解其實現(xiàn)原理。這篇文章是在我給組內(nèi)的小伙伴分享的PPT的基礎上改動而成,旨在幫助大家建立關(guān)于事務的相對體系的認識。由于當時正好趕上考試周,所以寫的比較倉促,里面肯定有理解不到位甚至出錯的地方,希望看到的小伙伴能夠我指出來。同時還需強調(diào)幾點:

  • 以下所有內(nèi)容都是針對單機事務而言,不涉及分布式事務相關(guān)的東西!
  • 關(guān)于事務原理的講解不針對具體的某個數(shù)據(jù)庫實現(xiàn),所以某些地方可能和你的實踐經(jīng)驗不符。

1. 認識事務

1.1 為什么需要數(shù)據(jù)庫事務

轉(zhuǎn)賬是生活中常見的操作,比如從A賬戶轉(zhuǎn)賬100元到B賬號。站在用戶角度而言,這是一個邏輯上的單一操作,然而在數(shù)據(jù)庫系統(tǒng)中,至少會分成兩個步驟來完成:

  • 1.將A賬戶的金額減少100元
  • 2.將B賬戶的金額增加100元。

在這個過程中可能會出現(xiàn)以下問題:

  • 1.轉(zhuǎn)賬操作的第一步執(zhí)行成功,A賬戶上的錢減少了100元,但是第二步執(zhí)行失敗或者未執(zhí)行便發(fā)生系統(tǒng)崩潰,導致B賬戶并沒有相應增加100元。
  • 2.轉(zhuǎn)賬操作剛完成就發(fā)生系統(tǒng)崩潰,系統(tǒng)重啟恢復時丟失了崩潰前的轉(zhuǎn)賬記錄。
  • 3.同時又另一個用戶轉(zhuǎn)賬給B賬戶,由于同時對B賬戶進行操作,導致B賬戶金額出現(xiàn)異常。

為了便于解決這些問題,需要引入數(shù)據(jù)庫事務的概念。

1.2 什么是數(shù)據(jù)庫事務

定義:數(shù)據(jù)庫事務是構(gòu)成單一邏輯工作單元的操作集合
一個典型的數(shù)據(jù)庫事務如下所示

BEGIN TRANSACTION //事務開始 SQL1 SQL2 COMMIT/ROLLBACK //事務提交或回滾

關(guān)于事務的定義有幾點需要解釋下:

  • 1.數(shù)據(jù)庫事務可以包含一個或多個數(shù)據(jù)庫操作,但這些操作構(gòu)成一個邏輯上的整體。
  • 2.構(gòu)成邏輯整體的這些數(shù)據(jù)庫操作,要么全部執(zhí)行成功,要么全部不執(zhí)行。
  • 3.構(gòu)成事務的所有操作,要么全都對數(shù)據(jù)庫產(chǎn)生影響,要么全都不產(chǎn)生影響,即不管事務是否執(zhí)行成功,數(shù)據(jù)庫總能保持一致性狀態(tài)。
  • 4.以上即使在數(shù)據(jù)庫出現(xiàn)故障以及并發(fā)事務存在的情況下依然成立。

1.3 事務如何解決問題

對于上面的轉(zhuǎn)賬例子,可以將轉(zhuǎn)賬相關(guān)的所有操作包含在一個事務中

BEGIN TRANSACTION A賬戶減少100元 B賬戶增加100元 COMMIT
  • 1.當數(shù)據(jù)庫操作失敗或者系統(tǒng)出現(xiàn)崩潰,系統(tǒng)能夠以事務為邊界進行恢復,不會出現(xiàn)A賬戶金額減少而B賬戶未增加的情況。
  • 2.當有多個用戶同時操作數(shù)據(jù)庫時,數(shù)據(jù)庫能夠以事務為單位進行并發(fā)控制,使多個用戶對B賬戶的轉(zhuǎn)賬操作相互隔離。

事務使系統(tǒng)能夠更方便的進行故障恢復以及并發(fā)控制,從而保證數(shù)據(jù)庫狀態(tài)的一致性。

1.4 事務的ACID特性以及實現(xiàn)原理概述

原子性(Atomicity):事務中的所有操作作為一個整體像原子一樣不可分割,要么全部成功,要么全部失敗。

一致性(Consistency):事務的執(zhí)行結(jié)果必須使數(shù)據(jù)庫從一個一致性狀態(tài)到另一個一致性狀態(tài)。一致性狀態(tài)是指:1.系統(tǒng)的狀態(tài)滿足數(shù)據(jù)的完整性約束(主碼,參照完整性,check約束等) 2.系統(tǒng)的狀態(tài)反應數(shù)據(jù)庫本應描述的現(xiàn)實世界的真實狀態(tài),比如轉(zhuǎn)賬前后兩個賬戶的金額總和應該保持不變。

隔離性(Isolation):并發(fā)執(zhí)行的事務不會相互影響,其對數(shù)據(jù)庫的影響和它們串行執(zhí)行時一樣。比如多個用戶同時往一個賬戶轉(zhuǎn)賬,最后賬戶的結(jié)果應該和他們按先后次序轉(zhuǎn)賬的結(jié)果一樣。

持久性(Durability):事務一旦提交,其對數(shù)據(jù)庫的更新就是持久的。任何事務或系統(tǒng)故障都不會導致數(shù)據(jù)丟失。

在事務的ACID特性中,C即一致性是事務的根本追求,而對數(shù)據(jù)一致性的破壞主要來自兩個方面

  • 1.事務的并發(fā)執(zhí)行
  • 2.事務故障或系統(tǒng)故障

數(shù)據(jù)庫系統(tǒng)是通過并發(fā)控制技術(shù)和日志恢復技術(shù)來避免這種情況發(fā)生的。

并發(fā)控制技術(shù)保證了事務的隔離性,使數(shù)據(jù)庫的一致性狀態(tài)不會因為并發(fā)執(zhí)行的操作被破壞。
日志恢復技術(shù)保證了事務的原子性,使一致性狀態(tài)不會因事務或系統(tǒng)故障被破壞。同時使已提交的對數(shù)據(jù)庫的修改不會因系統(tǒng)崩潰而丟失,保證了事務的持久性。

2.并發(fā)異常與并發(fā)控制技術(shù)

2.1 常見的并發(fā)異常

在講解并發(fā)控制技術(shù)前,先簡單介紹下數(shù)據(jù)庫常見的并發(fā)異常。

  • 臟寫
    臟寫是指事務回滾了其他事務對數(shù)據(jù)項的已提交修改,比如下面這種情況

在事務1對數(shù)據(jù)A的回滾,導致事務2對A的已提交修改也被回滾了。

  • 丟失更新
    丟失更新是指事務覆蓋了其他事務對數(shù)據(jù)的已提交修改,導致這些修改好像丟失了一樣。

事務1和事務2讀取A的值都為10,事務2先將A加上10并提交修改,之后事務2將A減少10并提交修改,A的值最后為,導致事務2對A的修改好像丟失了一樣

  • 臟讀
    臟讀是指一個事務讀取了另一個事務未提交的數(shù)據(jù)

在事務1對A的處理過程中,事務2讀取了A的值,但之后事務1回滾,導致事務2讀取的A是未提交的臟數(shù)據(jù)。

  • 不可重復讀
    不可重復讀是指一個事務對同一數(shù)據(jù)的讀取結(jié)果前后不一致。臟讀和不可重復讀的區(qū)別在于:前者讀取的是事務未提交的臟數(shù)據(jù),后者讀取的是事務已經(jīng)提交的數(shù)據(jù),只不過因為數(shù)據(jù)被其他事務修改過導致前后兩次讀取的結(jié)果不一樣,比如下面這種情況

由于事務2對A的已提交修改,事務1前后兩次讀取的結(jié)果不一致。

  • 幻讀
    幻讀是指事務讀取某個范圍的數(shù)據(jù)時,因為其他事務的操作導致前后兩次讀取的結(jié)果不一致。幻讀和不可重復讀的區(qū)別在于,不可重復讀是針對確定的某一行數(shù)據(jù)而言,而幻讀是針對不確定的多行數(shù)據(jù)。因而幻讀通常出現(xiàn)在帶有查詢條件的范圍查詢中,比如下面這種情況:

事務1查詢A<5的數(shù)據(jù),由于事務2插入了一條A=4的數(shù)據(jù),導致事務1兩次查詢得到的結(jié)果不一樣

2.2 事務的隔離級別

  • 事務具有隔離性,理論上來說事務之間的執(zhí)行不應該相互產(chǎn)生影響,其對數(shù)據(jù)庫的影響應該和它們串行執(zhí)行時一樣。

  • 然而完全的隔離性會導致系統(tǒng)并發(fā)性能很低,降低對資源的利用率,因而實際上對隔離性的要求會有所放寬,這也會一定程度造成對數(shù)據(jù)庫一致性要求降低

  • SQL標準為事務定義了不同的隔離級別,從低到高依次是

    • 讀未提交(READ UNCOMMITTED)
    • 讀已提交(READ COMMITTED)
    • 可重復讀(REPEATABLE READ)
    • 串行化(SERIALIZABLE)

    事務的隔離級別越低,可能出現(xiàn)的并發(fā)異常越多,但是通常而言系統(tǒng)能提供的并發(fā)能力越強。

    不同的隔離級別與可能的并發(fā)異常的對應情況如下表所示,有一點需要強調(diào),這種對應關(guān)系只是理論上的,對于特定的數(shù)據(jù)庫實現(xiàn)不一定準確,比如mysql
    的Innodb存儲引擎通過Next-Key Locking技術(shù)在可重復讀級別就消除了幻讀的可能。

    所有事務隔離級別都不允許出現(xiàn)臟寫,而串行化可以避免所有可能出現(xiàn)的并發(fā)異常,但是會極大的降低系統(tǒng)的并發(fā)處理能力。

    2.3 事務隔離性的實現(xiàn)——常見的并發(fā)控制技術(shù)

    并發(fā)控制技術(shù)是實現(xiàn)事務隔離性以及不同隔離級別的關(guān)鍵,實現(xiàn)方式有很多,按照其對可能沖突的操作采取的不同策略可以分為樂觀并發(fā)控制和悲觀并發(fā)控制兩大類。

    • 樂觀并發(fā)控制:對于并發(fā)執(zhí)行可能沖突的操作,假定其不會真的沖突,允許并發(fā)執(zhí)行,直到真正發(fā)生沖突時才去解決沖突,比如讓事務回滾。

    • 悲觀并發(fā)控制:對于并發(fā)執(zhí)行可能沖突的操作,假定其必定發(fā)生沖突,通過讓事務等待(鎖)或者中止(時間戳排序)的方式使并行的操作串行執(zhí)行。

    2.3.1 基于封鎖的并發(fā)控制

    核心思想:對于并發(fā)可能沖突的操作,比如讀-寫,寫-讀,寫-寫,通過鎖使它們互斥執(zhí)行。
    鎖通常分為共享鎖和排他鎖兩種類型

    • 1.共享鎖(S):事務T對數(shù)據(jù)A加共享鎖,其他事務只能對A加共享鎖但不能加排他鎖。
    • 2.排他鎖(X):事務T對數(shù)據(jù)A加排他鎖,其他事務對A既不能加共享鎖也不能加排他鎖

    基于鎖的并發(fā)控制流程:

  • 事務根據(jù)自己對數(shù)據(jù)項進行的操作類型申請相應的鎖(讀申請共享鎖,寫申請排他鎖)

  • 申請鎖的請求被發(fā)送給鎖管理器。鎖管理器根據(jù)當前數(shù)據(jù)項是否已經(jīng)有鎖以及申請的和持有的鎖是否沖突決定是否為該請求授予鎖。

  • 若鎖被授予,則申請鎖的事務可以繼續(xù)執(zhí)行;若被拒絕,則申請鎖的事務將進行等待,直到鎖被其他事務釋放。

  • 可能出現(xiàn)的問題:

    • 死鎖:多個事務持有鎖并互相循環(huán)等待其他事務的鎖導致所有事務都無法繼續(xù)執(zhí)行。

    • 饑餓:數(shù)據(jù)項A一直被加共享鎖,導致事務一直無法獲取A的排他鎖。

    對于可能發(fā)生沖突的并發(fā)操作,鎖使它們由并行變?yōu)榇袌?zhí)行,是一種悲觀的并發(fā)控制。

    2.3.2 基于時間戳的并發(fā)控制

    核心思想:對于并發(fā)可能沖突的操作,基于時間戳排序規(guī)則選定某事務繼續(xù)執(zhí)行,其他事務回滾。

    系統(tǒng)會在每個事務開始時賦予其一個時間戳,這個時間戳可以是系統(tǒng)時鐘也可以是一個不斷累加的計數(shù)器值,當事務回滾時會為其賦予一個新的時間戳,先開始的事務時間戳小于后開始事務的時間戳。

    每一個數(shù)據(jù)項Q有兩個時間戳相關(guān)的字段:
    W-timestamp(Q):成功執(zhí)行write(Q)的所有事務的最大時間戳
    R-timestamp(Q):成功執(zhí)行read(Q)的所有事務的最大時間戳

    時間戳排序規(guī)則如下:

  • 假設事務T發(fā)出read(Q),T的時間戳為TS
    a.若TS(T)<W-timestamp(Q),則T需要讀入的Q已被覆蓋。此
    read操作將被拒絕,T回滾。
    b.若TS(T)>=W-timestamp(Q),則執(zhí)行read操作,同時把
    R-timestamp(Q)設置為TS(T)與R-timestamp(Q)中的最大值

  • 假設事務T發(fā)出write(Q)
    a.若TS(T)<R-timestamp(Q),write操作被拒絕,T回滾。
    b.若TS(T)<W-timestamp(Q),則write操作被拒絕,T回滾。
    c.其他情況:系統(tǒng)執(zhí)行write操作,將W-timestamp(Q)設置
    為TS(T)。

  • 基于時間戳排序和基于鎖實現(xiàn)的本質(zhì)一樣:對于可能沖突的并發(fā)操作,以串行的方式取代并發(fā)執(zhí)行,因而它也是一種悲觀并發(fā)控制。它們的區(qū)別主要有兩點:

    • 基于鎖是讓沖突的事務進行等待,而基于時間戳排序是讓沖突的事務回滾。
    • 基于鎖沖突事務的執(zhí)行次序是根據(jù)它們申請鎖的順序,先申請的先執(zhí)行;而基于時間戳排序是根據(jù)特定的時間戳排序規(guī)則。

    2.3.3 基于有效性檢查的并發(fā)控制

    核心思想:事務對數(shù)據(jù)的更新首先在自己的工作空間進行,等到要寫回數(shù)據(jù)庫時才進行有效性檢查,對不符合要求的事務進行回滾。

    基于有效性檢查的事務執(zhí)行過程會被分為三個階段:

  • 讀階段:數(shù)據(jù)項被讀入并保存在事務的局部變量中。所有write操作都是對局部變量進行,并不對數(shù)據(jù)庫進行真正的更新。

  • 有效性檢查階段:對事務進行有效性檢查,判斷是否可以執(zhí)行write操作而不違反可串行性。如果失敗,則回滾該事務。

  • 寫階段:事務已通過有效性檢查,則將臨時變量中的結(jié)果更新到數(shù)據(jù)庫中。

  • 有效性檢查通常也是通過對事務的時間戳進行比較完成的,不過和基于時間戳排序的規(guī)則不一樣。

    該方法允許可能沖突的操作并發(fā)執(zhí)行,因為每個事務操作的都是自己工作空間的局部變量,直到有效性檢查階段發(fā)現(xiàn)了沖突才回滾。因而這是一種樂觀的并發(fā)策略。

    2.3.4 基于快照隔離的并發(fā)控制

    快照隔離是多版本并發(fā)控制(mvcc)的一種實現(xiàn)方式。

    其核心思想是:數(shù)據(jù)庫為每個數(shù)據(jù)項維護多個版本(快照),每個事務只對屬于自己的私有快照進行更新,在事務真正提交前進行有效性檢查,使得事務正常提交更新或者失敗回滾。

    由于快照隔離導致事務看不到其他事務對數(shù)據(jù)項的更新,為了避免出現(xiàn)丟失更新問題,可以采用以下兩種方案避免:

    • 先提交者獲勝:對于執(zhí)行該檢查的事務T,判斷是否有其他事務已經(jīng)將更新寫入數(shù)據(jù)庫,是則T回滾否則T正常提交。

    • 先更新者獲勝:通過鎖機制保證第一個獲得鎖的事務提交其更新,之后試圖更新的事務中止。

    事務間可能沖突的操作通過數(shù)據(jù)項的不同版本的快照相互隔離,到真正要寫入數(shù)據(jù)庫時才進行沖突檢測。因而這也是一種樂觀并發(fā)控制。

    2.3.5 關(guān)于并發(fā)控制技術(shù)的總結(jié)

    以上只是對常見的幾種并發(fā)控制技術(shù)進行了介紹,不涉及特別復雜的原理的講解。之所以這么做一是要真的把原理和實現(xiàn)細節(jié)講清楚需要涉及的東西太多,篇幅太長,從作者和讀者角度而言都不是一件輕松的事,所以只對其實現(xiàn)的核心思想和實現(xiàn)要點進行了簡單的介紹,其他部分就一筆帶過了。二是并發(fā)控制的實現(xiàn)的方式太過多樣,基于封鎖的實現(xiàn)就有很多變體,mvcc多版本并發(fā)控制的實現(xiàn)方式就更是多樣,而且很多時候會和其他并發(fā)控制方式比如封鎖的方式結(jié)合起來使用。

    3. 故障與故障恢復技術(shù)

    3.1 為什么需要故障恢復技術(shù)

    數(shù)據(jù)庫運行過程中可能會出現(xiàn)故障,這些故障包括事務故障和系統(tǒng)故障兩大類

    • 事務故障:比如非法輸入,系統(tǒng)出現(xiàn)死鎖,導致事務無法繼續(xù)執(zhí)行。
    • 系統(tǒng)故障:比如由于軟件漏洞或硬件錯誤導致系統(tǒng)崩潰或中止。

    這些故障可能會對事務和數(shù)據(jù)庫狀態(tài)造成破壞,因而必須提供一種技術(shù)來對各種故障進行恢復,保證數(shù)據(jù)庫一致性,事務的原子性以及持久性。數(shù)據(jù)庫通常以日志的方式記錄數(shù)據(jù)庫的操作從而在故障時進行恢復,因而可以稱之為日志恢復技術(shù)。

    3.2 事務的執(zhí)行過程以及可能產(chǎn)生的問題

    事務的執(zhí)行過程可以簡化如下:

  • 系統(tǒng)會為每個事務開辟一個私有工作區(qū)

  • 事務讀操作將從磁盤中拷貝數(shù)據(jù)項到工作區(qū)中,在執(zhí)行寫操作前所有的更新都作用于工作區(qū)中的拷貝.

  • 事務的寫操作將把數(shù)據(jù)輸出到內(nèi)存的緩沖區(qū)中,等到合適的時間再由緩沖區(qū)管理器將數(shù)據(jù)寫入到磁盤。

  • 由于數(shù)據(jù)庫存在立即修改和延遲修改,所以在事務執(zhí)行過程中可能存在以下情況:

    • 在事務提交前出現(xiàn)故障,但是事務對數(shù)據(jù)庫的部分修改已經(jīng)寫入磁盤數(shù)據(jù)庫中。這導致了事務的原子性被破壞。
    • 在系統(tǒng)崩潰前事務已經(jīng)提交,但數(shù)據(jù)還在內(nèi)存緩沖區(qū)中,沒有寫入磁盤。系統(tǒng)恢復時將丟失此次已提交的修改。這是對事務持久性的破壞。

    3.3 日志的種類和格式

    • <T,X,V1,V2>:描述一次數(shù)據(jù)庫寫操作,T是執(zhí)行寫操作的事務的唯一標識,X是要寫的數(shù)據(jù)項,V1是數(shù)據(jù)項的舊值,V2是數(shù)據(jù)項的新值。

    • <T,X,V1>:對數(shù)據(jù)庫寫操作的撤銷操作,將事務T的X數(shù)據(jù)項恢復為舊值V1。在事務恢復階段插入。

    • <T start>: 事務T開始

    • <T commit>: 事務T提交

    • <T abort>: 事務T中止

    關(guān)于日志,有以下兩條規(guī)則

    • 1.系統(tǒng)在對數(shù)據(jù)庫進行修改前會在日志文件末尾追加相應的日志記錄。
    • 2.當一個事務的commit日志記錄寫入到磁盤成功后,稱這個事務已提交,但事務所做的修改可能并未寫入磁盤

    3.4 日志恢復的核心思想

    • 撤銷事務undo:將事務更新的所有數(shù)據(jù)項恢復為日志中的舊值,事務撤銷完畢時將插入一條<T abort>記錄。

    • 重做事務redo:將事務更新的所有數(shù)據(jù)項恢復為日志中的新值。

    事務正常回滾/因事務故障中止將進行redo
    系統(tǒng)從崩潰中恢復時將先進行redo再進行undo。

    以下事務將進行undo:日志中只包括<T start>記錄,但既不包括<T commit>記錄也不包括<T abort>記錄.

    以下事務將進行redo:日志中包括<T start>記錄,也包括<T commit>記錄或<T abort>記錄。

    假設系統(tǒng)從崩潰中恢復時日志記錄如下

    <T0 start> <T0,A,1000,950> <T0,B,2000,2050> <T0 commit> <T1 start> <T1,C,700,600>

    由于T0既有start記錄又有commit記錄,將會對事務T0進行重做,執(zhí)行相應的redo操作。
    由于T1只有start記錄,將會對T1進行撤銷,執(zhí)行相應的undo操作,撤銷完畢將寫入一條abort記錄。

    3.5 事務故障中止/正常回滾的恢復流程

  • 從后往前掃描日志,對于事務T的每個形如<T,X,V1,V2>的記錄,將舊值V1寫入數(shù)據(jù)項X中。

  • 往日志中寫一個特殊的只讀記錄<T,X,V1>,表示將數(shù)據(jù)項恢復成舊值V1,
    這是一個只讀的補償記錄,不需要根據(jù)它進行undo。

  • 一旦發(fā)現(xiàn)了<T start>日志記錄,就停止繼續(xù)掃描,并往日志中寫一個
    <T abort>日志記錄。

  • 3.6 系統(tǒng)崩潰時的恢復過程(帶檢查點)

    檢查點是形如<checkpoint L>的特殊的日志記錄,L是寫入檢查點記錄時還未提交的事務的集合,系統(tǒng)保證在檢查點之前已經(jīng)提交的事務對數(shù)據(jù)庫的修改已經(jīng)寫入磁盤,不需要進行redo。檢查點可以加快恢復的過程。

    系統(tǒng)奔潰時的恢復過程分為兩個階段:重做階段和撤銷階段。

    重做階段:

  • 系統(tǒng)從最后一個檢查點開始正向的掃描日志,將要重做的事務的列表undo-list設置為檢查點日志記錄中的L列表。

  • 發(fā)現(xiàn)<T,X,V1,V2>的更新記錄或<T,X,V>的補償撤銷記錄,就重做該操作。

  • 發(fā)現(xiàn)<T start>記錄,就把T加入到undo-list中。

  • 發(fā)現(xiàn)<T abort>或<T commit>記錄,就把T從undo-list中去除。

  • 撤銷階段:

  • 系統(tǒng)從尾部開始反向掃描日志

  • 發(fā)現(xiàn)屬于undo-list中的事務的日志記錄,就執(zhí)行undo操作

  • 發(fā)現(xiàn)undo-list中事務的T的<T start>記錄,就寫入一條<T abort>記錄,
    并把T從undo-list中去除。

  • 4.undo-list為空,則撤銷階段結(jié)束

    總結(jié):先將日志記錄中所有事務的更新按順序重做一遍,在針對需要撤銷的事務按相反的順序執(zhí)行其更新操作的撤銷操作。

    3.6.1 一個系統(tǒng)崩潰恢復的例子

    恢復前的日志如下,寫入最后一條日志記錄后系統(tǒng)崩潰

    <T0 start> <T0,B,2000,2050> <T2 commit> <T1 start> <checkpoint {T0,T1}> //之前T2已經(jīng)commit,故不用重做 <T1,C,700,600> <T1 commit> <T2 start> <T2,A,500,400> <T0,B,2000> <T0 abort> //T0回滾完成,插入該記錄后系統(tǒng)崩潰

    4. 總結(jié)

    事務是數(shù)據(jù)庫系統(tǒng)進行并發(fā)控制的基本單位,是數(shù)據(jù)庫系統(tǒng)進行故障恢復的基本單位,從而也是保持數(shù)據(jù)庫狀態(tài)一致性的基本單位。ACID是事務的基本特性,數(shù)據(jù)庫系統(tǒng)是通過并發(fā)控制技術(shù)和日志恢復技術(shù)來對事務的ACID進行保證的,從而可以得到如下的關(guān)于數(shù)據(jù)庫事務的概念體系結(jié)構(gòu)。

    5. 參考資料

    《數(shù)據(jù)庫系統(tǒng)概論》
    《數(shù)據(jù)庫系統(tǒng)概念》

    總結(jié)

    以上是生活随笔為你收集整理的数据库事务的概念及其实现原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。