事務
什么是事務?事務通俗的講就是要做的事,在計算機術語中一般指訪問或更新數據庫中數據的一個工作單元。說起事務,那么就要提到事務的ACID特性,即原子性(atomicity)、一致性(consistency)、隔離性(isolation)和持久性(durability)。可是為什么說起事務就要提到這四個特性,這四個特性是一個事務必須遵守的標准呢還是對事務的一個期望目標呢,對於這個疑問,我有自己的理解。
事務通俗的將是要做的事,那么事務的特性就類似於操作規范,按照操作規范來做事就可以盡量避免發生措手不及的問題,最終把事情做好。如果把要做的事拆解一下,通常的步驟就是准備,定好目標,執行,獲得結果。對於計算機事務來說,執行一個工作單元,正確完成對數據庫的訪問或更新,使數據庫從一種狀態轉換成另一種狀態,這個執行過程就是計算機事務。如何從事務開始到結束來保證它的正確性,實現最終目標,這需要靠每個步驟上的正確執行來保證得到最后的正確結果。為了保證每個步驟的正確執行,就有了這四個特性。
事務特性
為了說明事務的特性,舉個窗口購買火車票的例子。首先簡單的分析一下,在購買火車票之前我們需要准備好身份證件和現金,最終結果是我們支付現金並且獲得火車票。但是如果購票業務沒做好,會出現那些情況呢。下面大致列舉一下:
1、乘客得到了火車票卻沒有給售票員付錢。
2、在辦理購票業務的時候提示票已售完。
如果現實中真的出現了這些問題,那是誰都不願意的看到的。因此為了保證購票業務的正確執行,必須把付錢和得到火車票看成一個整體,要么付錢並得到火車票,要么退錢結束購票。
而且在購票的過程中,便鎖定客戶的票,不能讓它被其他窗口買走。
例子是這樣一個簡單的例子,但用來說明事務的特性卻是足夠了。
- 原子性
原子性即不可分割性,含義是一個事務必須把它產生的所有更改作為一個單獨的工作單元進行提交或者回滾。無論有多少變動都將作為一個整體來處理。怎么來保證事務的原子性首先在事務開始之前對事務進行拆解,分析哪些動作是必須同時成功,同時失敗的,把這些綁在一起的動作看成一個完整的工作單元,這些動作要步調一致。這其實也就是做好一件事之前的准備階段。用窗口購票的例子來說就是把乘客付錢和得到火車票看成是一個整體。
- 一致性
一致性的意思是事務執行的結果必須是使數據庫從一個一致性狀態變到另一個一致性狀態(其實也就意味着在事務期間,對數據的增刪改要符合數據的完整性約束)。像這種比較正式的說法往往是用一個抽象的描述去形容另外一個抽象的東西,結果是更加糊塗了。購票這個例子中,所謂的一致性就是現金必須從乘客的手中扣除,而同時火車票也必須被賣出並交到乘客的手上。所以簡單點說,就是工作單元中每個動作的執行結果必須被落實,不能出現有的成功了而有的失敗了。這就是做好一件事所要達到的既定目標,只要當這件事的所有環節都完成以后才能算這件事完成了。
- 隔離性
隔離性,在有的地方也叫獨立性,其實意思都差不多。隔離性指的是各個獨立事務之間的交互程度,是由一致性和並發性共同決定的。像購票的這個例子,如果同時有多名乘客在不同的窗口購票,如果處理不當,很可能在購票的時候會出現兩個或兩個以上的窗口鎖定同一張火車票,並進行售賣的情況,最終不能保證事務的一致性。並發性越低,事務的隔離性越高,一致性也就越高。當提高事務的隔離性的時候,就很可能需要犧牲數據庫的並發性來保證數據的一致性。所以當設置事務的隔離級別的時候,就需要綜合考慮事務的一致性和並發性。因此通俗講事務的隔離性就是指的事情應該怎么做。關於事務的隔離性以及隔離級別稍后會有詳細說明。
- 持久性
持久性指的是一個事務一旦提交,那它對數據庫的更改就應該是永久的,不會因系統的失敗而丟失。當完成購票以后,售票員得到乘客的車票錢,乘客得到售票員給的車票,不能因為售票系統的崩潰就對既有事實進行抵賴,所以從某種程度上來說,持久性也可以指不可抵賴性,簽字蓋章,交易完成。這就是事情的最終結果。
PS:把事務理解成將要做的事,從自己如何確保做好一件事的角度來考慮就比較容易理解事務的幾個特性,畢竟我們自己也做過很多事,也遇到過各種各樣的問題。比如比如項目組成員共同開發項目,一人一個模塊,有的人完成了,有的人沒完成,導致項目整體進度出現異常,這些都說明了事務的原子性和一致性。手頭正做着工作,突然上頭又讓做別的工作,雜七雜八的,最終原本的工作不一定能按時完成,包括代碼的檢出、檢入的時候出現的代碼沖突和覆蓋等問題,也都體現了事務的隔離性。工作的溝通中,口頭說的容易忘,也很容易需求變更,這時候就需要編寫需求說明,需求分析以及詳細設計等文檔以及保留來往郵件作為結果產物作為依據。