資料庫的 ACID 屬性

來源:互聯網
上載者:User

標籤:https   之一   ret   gray   資料   red   art   期望   constrain   

原文連結:https://en.wikipedia.org/wiki/ACID

52007011

 

在電腦科學中,ACID(Atomicity 原子性、Consistency 一致性、Isolation 隔離性、Durability 持久性)是一系列屬性。

這些屬性保證了資料庫事物的可靠。在資料庫中,對資料的一系列操作在邏輯上可以看成一個整體的操作,這個整體的操作就叫事物。

例如,銀行從一個賬戶往另外一個賬戶轉賬的過程中就牽涉到多個變更操作。比如,減少一個賬戶的資金,同時增加另外一個賬戶的資金,就是一個事物。

Jim Gray 在 20 世紀 70 年代後期定義了可信事物系統的這些操作,後來這些技術都得到了發展。

在 1983 年, Andreas Reuter 和 Theo H?rder 發明了 ACID 這個縮減詞來描述資料庫事物的這些屬性。 
資料庫事物的特點:

Atomicity(原子性)

原子性要求每個事物中的所有操作要麼全部完成,要麼就像全部沒有發生一樣:如果事物中的部分操作失敗了,則整個事物事物失敗了,結果就是資料庫中的狀態保持沒變。原子性系統必須保證在各種情況下的原子性,包括主機斷電、主機發生了錯誤、主機奔潰。對外界來說,一個提交了的事物看起來(通過事物對資料庫產生的影響)是不可分的,一個失敗了的事物,對外界來說就好像什麼都沒有發生過一樣。

Consistency(一致性)

一致性確保了任何事物都會使資料庫從一種合法的狀態變為另一種合法的狀態。通過定義的各種規則,包括約束(constraints)、級聯(cascades)、觸發器(triggers)以及它們的組合來保證寫入資料庫的所有資料都必須是合法的。一致性並不能保證事物(程式)的正確性,換句話說事物的一致性並不一定如程式員所期望的那樣(這應該是由應用程式層代碼來負責的),它只能保證資料庫中的所有資料都不會違反定義好的規則,不管程式有沒有發生錯誤甚至是發生了任何錯誤都不會違反定義好的規則。

Isolation(隔離性)

隔離性保證了並發執行多個事物對系統的狀態的影響和序列化執行多個事物對系統的狀態的影響是一樣的。隔離性是並發控制的主要目標。 通過並發控制的方法,一個未完成的事物的影響對其他事物是不可見的。

Durability(持久性)

持久性保證了一個事物一旦被提交以後,其狀態就保持不變,甚至是發生了主機斷電、奔潰、錯誤等。例如,在關聯式資料庫中,一旦一組 sql 語句被執行後,其結果就被永久儲存(甚至事物剛被提交資料庫系統就發生了奔潰)。為了主機抵禦斷電的風險,事物(或者是事物的結果)必須被記錄在非揮發性儲存體中。

例子

下面的例子進一步的說明了 ACID 屬性。在下面的例子中資料庫表有兩列,A 和 B 。資料完整性約束要求 A 列的值和 B 列的值之和必須等於 100 。下面的 SQL 陳述式建立了一張表,這張表滿足上面的約束條件——A+B=100 。

CREATE TABLE acidtest (A INTEGER, B INTEGER, CHECK (A + B = 100));
  • 1
  • 2
原子性的反例

在資料庫系統中,原子性是 ACID 事物的四個屬性之一。在一個原子事物中,一系列的資料庫操作要麼全部發生,要麼全部不發生。這一系列的操作不能被相互分開,只執行部分操作。原子性要求這一系列操作不可分,原子性正如其名。原子性可以保證資料庫不會出現部分更新的情況。部分更新的情況帶來的問題遠遠要比所有的操作全部失敗帶來的問題還要嚴重。原子性意味著不可分。

一致性的反例

一致性是個非常泛化的術語,它要求資料必須滿足所有的合法規則。以前面的例子為例,合法性規則是要求 A + B = 100 ,同時 A 和 B 還必須為整數。對於 A 和 B 來說,其合法的範圍是可以被推斷出來的。所有的合法規則必須都被檢查從而確保了事物的一致性。假設一個事物嘗試著從 A 中減去 10 而不修改 B 。因為每個事物結束以後都會進行一致性檢查,在事物開始之前資料庫就知道 A + B = 100 。如果事物成功的從 A 中減去 10 ,原子性就生效了。然而,有效性校正會發現 A + B = 90 ,這與資料庫的約束規則不一致。整個事物必須被取消,被影響到的行復原到執行事物之前的狀態。如果還有其他約束、觸發器、級聯,每一個獨立改變的操作在事物被提交之前必須像前面一樣進行一致性檢查。

違反隔離性

為了示範隔離性,我們假設兩個事物在同時修改同一塊資料。為了維護隔離性,其中一個事物必須等到另外一個事物完成以後才能執行。考慮下面的兩個事物, T1 從 A 中轉出 10 到 B 。T2 從 B 中轉出 10 到 A 。可以分析出共有四個操作: 
1、T1 從 A 中減去 10 。 
2、T1 給 B 中加上 10 。 
3、T2 從 B 中減去 10 。 
4、T2 給 A 中加上 10 。 
如果這些操作按照上面的順序執行,就可以達到隔離性,儘管 T2 必須等待 T1 先執行。如果 T1 中途失敗了,資料庫系統會消除掉 T1 對資料庫所產生的影響,T2 看到的仍然是合法的資料。

由於兩個事物可能交錯執行,這幾個操作的實際執行順序可能是:

  • T1 從 A 中減去 10 。
  • T2 從 B 中減去 10 。
  • T2 給 A 增加 10 。
  • T1 給 B 增加 10 。

再次假設,T1 中途失敗了,將會發生什麼。如果 T1 在第四步:T1 給 B 增加 10 時失敗了,而此時 T2 已經修改完了 A 和 B;被改變的資料無法恢複到 T1 執行之前的狀態,導致了資料庫產生了不合法的狀態。 這就是有名的 “write-write failure” 失敗,由於兩個事物嘗試同時修改同一個資料區塊。 在一個典型的系統中,這個問題可以解決。通過取消失敗的事物 T1 ,從而使資料庫恢複到上次的合法狀態,然後重新開始執行被中斷的事物 T2 。

違反持久性

假設一個事物從 A 中減去 10 加到 B 中。首先,事物會從 A 中減去 10 ,然後再在 B 中加上 10 。 在此時,執行事物的程式會告訴使用者,事物已經成功執行了。然後,此時這些改變的資料仍然還在磁碟緩衝區中排隊等待寫入磁碟中。如果這時主機發生斷電,資料庫中所有的改變就會丟失。使用者還以為所有的改變都已經持久化到磁碟中了。

實現

處理一個事物通常需要一系列的操作,任意一個操作失敗了都會導致整個事物的失敗,因此,造成事物失敗的原因有好多個。例如,系統的磁碟已經滿了,再沒有空間了,或者是事物已經用光了作業系統分配給它的 CPU 時間片。有兩種大家都很熟悉的流行技術:預寫式日誌記錄和影子分頁。這兩種技術中,必須要在將被更新的所有資訊上擷取鎖。擷取的鎖依賴事物的隔離等級,有可能所有的資料僅僅是被讀取,也需要擷取鎖。在預寫式日誌記錄技術中,在改變資料庫之前通過複製原始的(未改變的)資料到日誌記錄中來保證原子性。有了日誌記錄就可以使資料庫恢複到發生奔潰事件之前的一致性狀態。在影子分頁技術中,更新被應用到資料庫的部分拷貝中,當資料庫事物提交時,新的拷貝才被啟用了。

好多資料庫依賴鎖來實現 ACID 能力。鎖意味著事物在其需要訪問的資料上打個標記,這樣一來資料庫管理系統就會知道這些資料在該事物完成(事物成功或失敗)之前不允許其他事物修改這些被打了標記的資料。鎖在資料被處理之前必須擷取到,也包括處理那些只會被讀取但不會被修改的資料之前也要擷取鎖。非平常事物通常需要大量鎖,導致了不小的效能開銷同時也阻塞了其他事物。例如,使用者 A 正在執行一個事物,需要讀取某一行資料而這時另外一個使用者 B 正在修改這一行資料。使用者 B 必須等到使用者 A 的事物徹底完成。通常可以通過兩個階段鎖來保證全隔離性。

資料庫的 ACID 屬性

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.