天天看點

資料庫ACID

談談資料庫的ACID

一.事務

定義:所謂事務,它是一個操作序列,這些操作要麼都執行,要麼都不執行,它是一個不可分割的工作機關。

準備工作:為了說明事務的ACID原理,我們使用銀行賬戶及資金管理的案例進行分析。

// 建立資料庫
   create table account(
      idint primary key not null,
      namevarchar(40),
      moneydouble
   );

   // 有兩個人開戶并存錢
   insert into account values(1,'A',1000);
   insert into account values(2,'B',1000); 
           

二.ACID

ACID,是指在可靠資料庫管理系統(DBMS)中,事務(transaction)所應該具有的四個特性:原子性(Atomicity)、一緻性(Consistency)、隔離性(Isolation)、持久性(Durability).這是可靠資料庫所應具備的幾個特性.下面針對這幾個特性進行逐個講解.

三.原子性

原子性是指事務是一個不可再分割的工作機關,事務中的操作要麼都發生,要麼都不發生。

1.案例

A給B轉帳100元錢

begin transaction
   update account set money= money - 100where name='A';
   update account set money= money +100where name='B';
   if Error then
          rollback
   else
          commit
           

2.分析

在事務中的扣款和加款兩條語句,要麼都執行,要麼就都不執行。否則如果隻執行了扣款語句,就送出了,此時如果突然斷電,A賬号已經發生了扣款,B賬号卻沒收到加款,在生活中就會引起糾紛。

3.解決方法

在資料庫管理系統(DBMS)中,預設情況下一條SQL就是一個單獨事務,事務是自動送出的。隻有顯式的使用start transaction開啟一個事務,才能将一個代碼塊放在事務中執行。保障事務的原子性是資料庫管理系統的責任,為此許多資料源采用日志機制。例如,SQL Server使用一個預寫事務日志,在将資料送出到實際資料頁面前,先寫在事務日志上。

四.一緻性

一緻性是指在事務開始之前和事務結束以後,資料庫的完整性限制沒有被破壞。這是說資料庫事務不能破壞關系資料的完整性以及業務邏輯上的一緻性。

1.案例

對銀行轉帳事務,不管事務成功還是失敗,應該保證事務結束後ACCOUNT表中aaa和bbb的存款總額為2000元。

2.解決方法

保障事務的一緻性,可以從以下兩個層面入手

2.1資料庫機制層面

資料庫層面的一緻性是,在一個事務執行之前和之後,資料會符合你設定的限制(唯一限制,外鍵限制,Check限制等)和觸發器設定。這一點是由SQL SERVER進行保證的。比如轉賬,則可以使用CHECK限制兩個賬戶之和等于2000來達到一緻性目的

2.2業務層面

對于業務層面來說,一緻性是保持業務的一緻性。這個業務一緻性需要由開發人員進行保證。當然,很多業務方面的一緻性,也可以通過轉移到資料庫機制層面進行保證。

五.隔離性

多個事務并發通路時,事務之間是隔離的,一個事務不應該影響其它事務運作效果。

這指的是在并發環境中,當不同的事務同時操縱相同的資料時,每個事務都有各自的完整資料空間。由并發事務所做的修改必須與任何其他并發事務所做的修改隔離。事務檢視資料更新時,資料所處的狀态要麼是另一事務修改它之前的狀态,要麼是另一事務修改它之後的狀态,事務不會檢視到中間狀态的資料。

在Windows中,如果多個程序對同一個檔案進行修改是不允許的,Windows通過這種方式來保證不同程序的隔離性:

企業開發中,事務最複雜問題都是由事務隔離性引起的。當多個事務并發時,SQL Server利用加鎖和阻塞來保證事務之間不同等級的隔離性。一般情況下,完全的隔離性是不現實的,完全的隔離性要求資料庫同一時間隻執行一條事務,這樣會嚴重影響性能。想要了解SQL Server中對于隔離性的保障,首先要了解并發事務之間是如何幹擾的.

1.事務之間的互相影響

事務之間的互相影響分為幾種,分别為:髒讀,不可重複讀,幻讀,丢失更新

1.1髒讀

髒讀意味着一個事務讀取了另一個事務未送出的資料,而這個資料是有可能復原的;如下案例,此時如果事務1復原,則B賬戶必将有損失。

資料庫ACID

1.2不可重複讀

不可重複讀意味着,在資料庫通路中,一個事務範圍内兩個相同的查詢卻傳回了不同資料。這是由于查詢時系統中其他事務修改的送出而引起的。如下案例,事務1必然會變得糊塗,不知道發生了什麼。

資料庫ACID

1.3幻讀(虛讀)

幻讀,是指當事務不是獨立執行時發生的一種現象,例如第一個事務對一個表中的資料進行了修改,這種修改涉及到表中的全部資料行。同時,第二個事務也修改這個表中的資料,這種修改是向表中插入一行新資料。那麼,以後就會發生操作第一個事務的使用者發現表中還有沒有修改的資料行,就好象發生了幻覺一樣.

資料庫ACID

1.4丢失更新

兩個事務同時讀取同一條記錄,A先修改記錄,B也修改記錄(B是不知道A修改過),B送出資料後B的修改結果覆寫了A的修改結果。

六.持久性

持久性,意味着在事務完成以後,該事務所對資料庫所作的更改便持久的儲存在資料庫之中,并不會被復原。

即使出現了任何事故比如斷電等,事務一旦送出,則持久化儲存在資料庫中。

七.總結

事務的(ACID)特性是由關系資料庫管理系統(RDBMS,資料庫系統)來實作的。資料庫管理系統采用日志來保證事務的原子性、一緻性和持久性。日志記錄了事務對資料庫所做的更新,如果某個事務在執行過程中發生錯誤,就可以根據日志,撤銷事務對資料庫已做的更新,使資料庫退回到執行事務前的初始狀态。

  資料庫管理系統采用鎖機制來實作事務的隔離性。當多個事務同時更新資料庫中相同的資料時,隻允許持有鎖的事務能更新該資料,其他事務必須等待,直到前一個事務釋放了鎖,其他事務才有機會更新該資料。