#54 資料庫的 Transaction (交易) - ACID 基本介紹

在關聯式資料庫 (Relational Database) 裡,Transaction 是一個極為重要的特性,或許也可以稱為功能.若我印象沒記錯,Transaction 在台灣的書藉裡普遍翻譯成 "交易".雖然覺得用 "交易" 來表示蠻奇怪的,但也只能將就這情況,畢竟這翻譯詞已存在很久了.基本上而言,一個 Transaction 是指用戶端傳送給資料庫引擎所要執行的動作.這些動作通常是以 SQL 語法組成,然後再由資料庫引擎來解析語法,轉成各式各樣的動作來執行.比如,用戶端傳來了一個 Update Table1 set Column1='some word',這個語法是告訴資料庫引擎去尋找 Table1 的表格,然後將這個表格裡 Column1 欄位的內容改成 'some word'.這個語法本身就是一個 Transaction,其本身的特性需要有足夠的單獨性,一致性,持續性以及不被干擾的特質,也就是市面上書藉裡常提到的 ACID.這些特性是在 1980 年代一位著名的學者 Jim Gray 所提出,後來再經由其他學者加以擴展而成現在所看到的 ACID.

  • Atomicity: 這指的是單獨性.比如,一個 Transaction 裡有一個 Update command,一個 Delete command.如果 Update command 成功了而 Delete command 失敗了,則這個 Transaction 便是失敗的,所以 Update command 必須回復修改過的資料.
  • Consistency: 一致性代表的是在 Transaction 執行前後,資料皆處於合乎所有規則的狀態.例如,某個欄位具有 foreign key 的關係,其資料的內容不是能隨意產生的,必乎符合 foreign key 的關係,所以 transaction 在執行後,這樣的關係必需持續下去.
  • Isolation: 這指的是不同的 Transaction 之間執行時不能被彼此干擾.假設有兩個 Transaction 在同一時間對相同的一百筆資料進行更新動作,而其中一個 Transaction 在更新到一半時產生錯誤,於是進行資料回復.然而,另一個 Transaction 是完成的.可想而知最後的資料狀態一定是無法預測,因為不清楚那些資料是失敗的 Transaction 做資料回復的,還是成功的 Transaction 所更新完成的.
  • Durability: 我將它稱之為資料的耐力.資料庫引擎必須要保證一旦 Transaction 完成後,不論發生任何事情,如系統當機或電力中斷等,運作後的資料都必須存在於儲存媒介中,也就是在硬碟裡.

一個商業化的關聯式資料庫都必須提供這些特性,因為一個強大的資料庫引擎需要服務很多的用戶端,因此這些特性不只要提供,而且得做的夠好才能夠在市面上生存.未來的文章裡將會介紹更多的主題來說明資料庫引擎是如何達成這些功能.

接下來,讓我們用一些符號來說明 Transaction.

一般來說,使用 T 來表示 Transaction,而RT(O) 代表 T 要對 O 進行讀取的動作,WT(O) 就是代表 T 要對 O 進行寫入的動作,其中 O 代表的是資料庫裡某個儲存單元,例如表格.

Transaction 的完成的結果只有兩種,一個是成功 (Commit),另一個是放棄 (Abort).Commit 代表的就是 Transaction 裡的每一個資料的讀取和寫入都是成功的,而 Abort 代表的是 Transaction 裡並不是有所有的資料讀取或寫入都是成功的.在符號上則使用 CommitT 來代表 T 是 Commit 結果,用 AbortT 來表示 T 是 Abort 結果.也許你查不同的書藉會有不同的表示方法,但這不會造成影響.介紹這些符號的目的是為了未來說明 Transaction 的動作時,可以用簡單的符號來代表一些事情.例如,


這代表了系統裡有兩個 Transaction, T1 和 T2,其中 T1 進行的動作是讀取A,寫入A,讀取B,寫入B,最後的結果是 Commit.表格裡的每一行代表同一時間上所做的動作.因此,這一個例子是不合法的,因為不能有兩個 Transaction 在同一時間對同一個物件做寫入的動作,這違反了 Isolation 的特性.

一個資料庫引擎的效能往往也由它對 ACID 特性的執行速度來決定.你可以發生問題都是發生在寫入的動作上.因為寫入代表刪除或更新,這將改變了資料庫內的資料狀態.如果你有一個資料庫只需要提供讀取而沒有寫入,那麼 ACID 特性對資料庫引擎而言就沒什麼意義了.

Share:

0 意見:

張貼留言