1. 程式人生 > >Java 事務詳講

Java 事務詳講

事務

什麼是事務?事務通俗的講就是要做的事,在計算機術語中一般指訪問或更新資料庫中資料的一個工作單元。說起事務,那麼就要提到事務的ACID特性,即原子性(atomicity)、一致性(consistency)、隔離性(isolation)和永續性(durability)。可是為什麼說起事務就要提到這四個特性,這四個特性是一個事務必須遵守的標準呢還是對事務的一個期望目標呢,對於這個疑問,我有自己的理解。

事務通俗的將是要做的事,那麼事務的特性就類似於操作規範,按照操作規範來做事就可以儘量避免發生措手不及的問題,最終把事情做好。如果把要做的事拆解一下,通常的步驟就是準備,定好目標,執行,獲得結果。對於計算機事務來說,執行一個工作單元,正確完成對資料庫的訪問或更新,使資料庫從一種狀態轉換成另一種狀態,這個執行過程就是計算機事務。如何從事務開始到結束來保證它的正確性,實現最終目標,這需要靠每個步驟上的正確執行來保證得到最後的正確結果。為了保證每個步驟的正確執行,就有了這四個特性。

 

事務特性

為了說明事務的特性,舉個視窗購買火車票的例子。首先簡單的分析一下,在購買火車票之前我們需要準備好身份證件和現金,最終結果是我們支付現金並且獲得火車票。但是如果購票業務沒做好,會出現那些情況呢。下面大致列舉一下:

1、乘客得到了火車票卻沒有給售票員付錢。

2、在辦理購票業務的時候提示票已售完。

如果現實中真的出現了這些問題,那是誰都不願意的看到的。因此為了保證購票業務的正確執行,必須把付錢和得到火車票看成一個整體,要麼付錢並得到火車票,要麼退錢結束購票。

而且在購票的過程中,便鎖定客戶的票,不能讓它被其他視窗買走。

例子是這樣一個簡單的例子,但用來說明事務的特性卻是足夠了。

 

  • 原子性

原子性即不可分割性,含義是一個事務必須把它產生的所有更改作為一個單獨的工作單元進行提交或者回滾。無論有多少變動都將作為一個整體來處理。怎麼來保證事務的原子性首先在事務開始之前對事務進行拆解,分析哪些動作是必須同時成功,同時失敗的,把這些綁在一起的動作看成一個完整的工作單元,這些動作要步調一致。這其實也就是做好一件事之前的準備階段。用視窗購票的例子來說就是把乘客付錢和得到火車票看成是一個整體。

  • 一致性

一致性的意思是事務執行的結果必須是使資料庫從一個一致性狀態變到另一個一致性狀態(其實也就意味著在事務期間,對資料的增刪改要符合資料的完整性約束)。像這種比較正式的說法往往是用一個抽象的描述去形容另外一個抽象的東西,結果是更加糊塗了。購票這個例子中,所謂的一致性就是現金必須從乘客的手中扣除,而同時火車票也必須被賣出並交到乘客的手上。所以簡單點說,就是工作單元中每個動作的執行結果必須被落實,不能出現有的成功了而有的失敗了。這就是做好一件事所要達到的既定目標,只要當這件事的所有環節都完成以後才能算這件事完成了。

  • 隔離性

隔離性,在有的地方也叫獨立性,其實意思都差不多。隔離性指的是各個獨立事務之間的互動程度,是由一致性和併發性共同決定的。像購票的這個例子,如果同時有多名乘客在不同的視窗購票,如果處理不當,很可能在購票的時候會出現兩個或兩個以上的視窗鎖定同一張火車票,並進行售賣的情況,最終不能保證事務的一致性。併發性越低,事務的隔離性越高,一致性也就越高。當提高事務的隔離性的時候,就很可能需要犧牲資料庫的併發性來保證資料的一致性。所以當設定事務的隔離級別的時候,就需要綜合考慮事務的一致性和併發性。因此通俗講事務的隔離性就是指的事情應該怎麼做。關於事務的隔離性以及隔離級別稍後會有詳細說明。

  • 永續性

永續性指的是一個事務一旦提交,那它對資料庫的更改就應該是永久的,不會因系統的失敗而丟失。當完成購票以後,售票員得到乘客的車票錢,乘客得到售票員給的車票,不能因為售票系統的崩潰就對既有事實進行抵賴,所以從某種程度上來說,永續性也可以指不可抵賴性,簽字蓋章,交易完成。這就是事情的最終結果。

 

PS:把事務理解成將要做的事,從自己如何確保做好一件事的角度來考慮就比較容易理解事務的幾個特性,畢竟我們自己也做過很多事,也遇到過各種各樣的問題。比如比如專案組成員共同開發專案,一人一個模組,有的人完成了,有的人沒完成,導致專案整體進度出現異常,這些都說明了事務的原子性和一致性。手頭正做著工作,突然上頭又讓做別的工作,雜七雜八的,最終原本的工作不一定能按時完成,包括程式碼的檢出、檢入的時候出現的程式碼衝突和覆蓋等問題,也都體現了事務的隔離性。工作的溝通中,口頭說的容易忘,也很容易需求變更,這時候就需要編寫需求說明,需求分析以及詳細設計等文件以及保留來往郵件作為結果產物作為依據。

 

事務

什麼是事務?事務通俗的講就是要做的事,在計算機術語中一般指訪問或更新資料庫中資料的一個工作單元。說起事務,那麼就要提到事務的ACID特性,即原子性(atomicity)、一致性(consistency)、隔離性(isolation)和永續性(durability)。可是為什麼說起事務就要提到這四個特性,這四個特性是一個事務必須遵守的標準呢還是對事務的一個期望目標呢,對於這個疑問,我有自己的理解。

事務通俗的將是要做的事,那麼事務的特性就類似於操作規範,按照操作規範來做事就可以儘量避免發生措手不及的問題,最終把事情做好。如果把要做的事拆解一下,通常的步驟就是準備,定好目標,執行,獲得結果。對於計算機事務來說,執行一個工作單元,正確完成對資料庫的訪問或更新,使資料庫從一種狀態轉換成另一種狀態,這個執行過程就是計算機事務。如何從事務開始到結束來保證它的正確性,實現最終目標,這需要靠每個步驟上的正確執行來保證得到最後的正確結果。為了保證每個步驟的正確執行,就有了這四個特性。

 

事務特性

為了說明事務的特性,舉個視窗購買火車票的例子。首先簡單的分析一下,在購買火車票之前我們需要準備好身份證件和現金,最終結果是我們支付現金並且獲得火車票。但是如果購票業務沒做好,會出現那些情況呢。下面大致列舉一下:

1、乘客得到了火車票卻沒有給售票員付錢。

2、在辦理購票業務的時候提示票已售完。

如果現實中真的出現了這些問題,那是誰都不願意的看到的。因此為了保證購票業務的正確執行,必須把付錢和得到火車票看成一個整體,要麼付錢並得到火車票,要麼退錢結束購票。

而且在購票的過程中,便鎖定客戶的票,不能讓它被其他視窗買走。

例子是這樣一個簡單的例子,但用來說明事務的特性卻是足夠了。

 

  • 原子性

原子性即不可分割性,含義是一個事務必須把它產生的所有更改作為一個單獨的工作單元進行提交或者回滾。無論有多少變動都將作為一個整體來處理。怎麼來保證事務的原子性首先在事務開始之前對事務進行拆解,分析哪些動作是必須同時成功,同時失敗的,把這些綁在一起的動作看成一個完整的工作單元,這些動作要步調一致。這其實也就是做好一件事之前的準備階段。用視窗購票的例子來說就是把乘客付錢和得到火車票看成是一個整體。

  • 一致性

一致性的意思是事務執行的結果必須是使資料庫從一個一致性狀態變到另一個一致性狀態(其實也就意味著在事務期間,對資料的增刪改要符合資料的完整性約束)。像這種比較正式的說法往往是用一個抽象的描述去形容另外一個抽象的東西,結果是更加糊塗了。購票這個例子中,所謂的一致性就是現金必須從乘客的手中扣除,而同時火車票也必須被賣出並交到乘客的手上。所以簡單點說,就是工作單元中每個動作的執行結果必須被落實,不能出現有的成功了而有的失敗了。這就是做好一件事所要達到的既定目標,只要當這件事的所有環節都完成以後才能算這件事完成了。

  • 隔離性

隔離性,在有的地方也叫獨立性,其實意思都差不多。隔離性指的是各個獨立事務之間的互動程度,是由一致性和併發性共同決定的。像購票的這個例子,如果同時有多名乘客在不同的視窗購票,如果處理不當,很可能在購票的時候會出現兩個或兩個以上的視窗鎖定同一張火車票,並進行售賣的情況,最終不能保證事務的一致性。併發性越低,事務的隔離性越高,一致性也就越高。當提高事務的隔離性的時候,就很可能需要犧牲資料庫的併發性來保證資料的一致性。所以當設定事務的隔離級別的時候,就需要綜合考慮事務的一致性和併發性。因此通俗講事務的隔離性就是指的事情應該怎麼做。關於事務的隔離性以及隔離級別稍後會有詳細說明。

  • 永續性

永續性指的是一個事務一旦提交,那它對資料庫的更改就應該是永久的,不會因系統的失敗而丟失。當完成購票以後,售票員得到乘客的車票錢,乘客得到售票員給的車票,不能因為售票系統的崩潰就對既有事實進行抵賴,所以從某種程度上來說,永續性也可以指不可抵賴性,簽字蓋章,交易完成。這就是事情的最終結果。

 

PS:把事務理解成將要做的事,從自己如何確保做好一件事的角度來考慮就比較容易理解事務的幾個特性,畢竟我們自己也做過很多事,也遇到過各種各樣的問題。比如比如專案組成員共同開發專案,一人一個模組,有的人完成了,有的人沒完成,導致專案整體進度出現異常,這些都說明了事務的原子性和一致性。手頭正做著工作,突然上頭又讓做別的工作,雜七雜八的,最終原本的工作不一定能按時完成,包括程式碼的檢出、檢入的時候出現的程式碼衝突和覆蓋等問題,也都體現了事務的隔離性。工作的溝通中,口頭說的容易忘,也很容易需求變更,這時候就需要編寫需求說明,需求分析以及詳細設計等文件以及保留來往郵件作為結果產物作為依據。