<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          不懂數(shù)據(jù)庫事務實現(xiàn)原理,還想混高級?

          共 8177字,需瀏覽 17分鐘

           ·

          2021-07-05 13:51

          點擊上方藍色字體,選擇“標星公眾號”

          優(yōu)質文章,第一時間送達

            作者 |  takumiCX

          來源 |  urlify.cn/Nz6bma

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


          • 以下所有內(nèi)容都是針對單機事務而言,不涉及分布式事務相關的東西!

          • 關于事務原理的講解不針對具體的某個數(shù)據(jù)庫實現(xiàn),所以某些地方可能和你的實踐經(jīng)驗不符。

          1. 認識事務

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

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

          • 1.將A賬戶的金額減少100元

          • 2.將B賬戶的金額增加100元。

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

          • 1.轉賬操作的第一步執(zhí)行成功,A賬戶上的錢減少了100元,但是第二步執(zhí)行失敗或者未執(zhí)行便發(fā)生系統(tǒng)崩潰,導致B賬戶并沒有相應增加100元。

          • 2.轉賬操作剛完成就發(fā)生系統(tǒng)崩潰,系統(tǒng)重啟恢復時丟失了崩潰前的轉賬記錄。

          • 3.同時又另一個用戶轉賬給B賬戶,由于同時對B賬戶進行操作,導致B賬戶金額出現(xiàn)異常。

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

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

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

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

          關于事務的定義有幾點需要解釋下:

          • 1.數(shù)據(jù)庫事務可以包含一個或多個數(shù)據(jù)庫操作,但這些操作構成一個邏輯上的整體。

          • 2.構成邏輯整體的這些數(shù)據(jù)庫操作,要么全部執(zhí)行成功,要么全部不執(zhí)行。

          • 3.構成事務的所有操作,要么全都對數(shù)據(jù)庫產(chǎn)生影響,要么全都不產(chǎn)生影響,即不管事務是否執(zhí)行成功,數(shù)據(jù)庫總能保持一致性狀態(tài)。

          • 4.以上即使在數(shù)據(jù)庫出現(xiàn)故障以及并發(fā)事務存在的情況下依然成立。

          1.3 事務如何解決問題

          對于上面的轉賬例子,可以將轉賬相關的所有操作包含在一個事務中

          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賬戶的轉賬操作相互隔離。

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

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

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

          一致性(Consistency):事務的執(zhí)行結果必須使數(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),比如轉賬前后兩個賬戶的金額總和應該保持不變。

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

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

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

          • 1.事務的并發(fā)執(zhí)行

          • 2.事務故障或系統(tǒng)故障

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

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

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

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

          在講解并發(fā)控制技術前,先簡單介紹下數(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ù)的讀取結果前后不一致。臟讀和不可重復讀的區(qū)別在于:前者讀取的是事務未提交的臟數(shù)據(jù),后者讀取的是事務已經(jīng)提交的數(shù)據(jù),只不過因為數(shù)據(jù)被其他事務修改過導致前后兩次讀取的結果不一樣,比如下面這種情況

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

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

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

          2.2 事務的隔離級別

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

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

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

          • 讀未提交(READ UNCOMMITTED)

          • 讀已提交(READ COMMITTED)

          • 可重復讀(REPEATABLE READ)

          • 串行化(SERIALIZABLE)

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

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

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

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

          并發(fā)控制技術是實現(xià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ā)控制流程:

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

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

          3. 若鎖被授予,則申請鎖的事務可以繼續(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有兩個時間戳相關的字段:
          W-timestamp(Q):成功執(zhí)行write(Q)的所有事務的最大時間戳
          R-timestamp(Q):成功執(zhí)行read(Q)的所有事務的最大時間戳

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

          1. 假設事務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)中的最大值

          2. 假設事務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)的本質一樣:對于可能沖突的并發(fā)操作,以串行的方式取代并發(fā)執(zhí)行,因而它也是一種悲觀并發(fā)控制。它們的區(qū)別主要有兩點:

          • 基于鎖是讓沖突的事務進行等待,而基于時間戳排序是讓沖突的事務回滾。

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

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

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

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

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

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

          3. 寫階段:事務已通過有效性檢查,則將臨時變量中的結果更新到數(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 關于并發(fā)控制技術的總結

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

          3. 故障與故障恢復技術

          3.1 為什么需要故障恢復技術

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

          • 事務故障:比如非法輸入,系統(tǒng)出現(xiàn)死鎖,導致事務無法繼續(xù)執(zhí)行。

          • 系統(tǒng)故障:比如由于軟件漏洞或硬件錯誤導致系統(tǒng)崩潰或中止。

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

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

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

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

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

          3. 事務的寫操作將把數(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ī)則

          • 1.系統(tǒng)在對數(shù)據(jù)庫進行修改前會在日志文件末尾追加相應的日志記錄。

          • 2.當一個事務的commit日志記錄寫入到磁盤成功后,稱這個事務已提交,但事務所做的修改可能并未寫入磁盤

          3.4 日志恢復的核心思想

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

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

          事務正?;貪L/因事務故障中止將進行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 事務故障中止/正?;貪L的恢復流程

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

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

          3. 一旦發(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)奔潰時的恢復過程分為兩個階段:重做階段和撤銷階段。

          重做階段:

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

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

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

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

          撤銷階段:

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

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

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

          4.undo-list為空,則撤銷階段結束

          總結:先將日志記錄中所有事務的更新按順序重做一遍,在針對需要撤銷的事務按相反的順序執(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. 總結

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










          瀏覽 31
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  天天色色| 一道无码在线视 | 狠狠干,狠狠操 | 久久谢| 啪啪啪导航 |