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