如果你是一名後臺程式設計師開發,那麼你一定或多或少的接觸過事務。因為相對於高併發,且業務有一定複雜性的系統來說,事務是一定需要的,而且是必須的。他可以幫助我們將若干不同的子任務當成一個整體來完成,以保證整個業務的正確性。
舉個簡單的例子:
在七夕這天,你給你的女票發了一個520紅包
對於錢款轉移的這個過程來說,存在兩個子任務
首先從你的餘額里扣款(520元)
同時往你的女票餘額裡增加錢(520元)
這兩個子任務對於紅包業務來說,要麼都成功,要麼都不成功,不應該存在你扣款了,但是你的女票沒有加錢的中間狀態。這種被看作一個整體,並且子任務的狀態都需要保持一致狀態的事情(狀態:操作成功,或者完全沒有操作成功),我們就稱之為事務。(防盜連線:本文首發自http://www.cnblogs.com/jilodream/ )當然這只是一個非常簡單的例子。下邊是更專業的定義:
事務是資料庫管理系統,在執行的過程中的一個邏輯單位,他由一個有限的資料庫操作序列構成。
其中邏輯單位表示事務不可拆分,結果一致(成功或者失敗)
而我們平常更多的將事務特指DML型別的操作,也就是對資料的增刪改,而不是所有的資料庫操作,例如其他的建表,刪表等。
這裡還要注意的一點是,事務是一個能力,並不是所有的資料庫都支援事務的。在mysql中,只有官方自帶的引擎只有NDBA和innodb支援事務。
針對事務,我們從四個方面進行探討,也就是事務的四大特性---ACID
下邊我們來分別談談這四個特性
A:Atomicity 原子性
原子性是指啥呢?
原子Atomicity在希臘語中轉化而來,本意就是不可再拆分。最終結果要麼就是全部成功,要麼就是全部失敗,不存在拆分開來,部分成功的場景,也就是是前文所說的邏輯單位。
D:Durability 永續性
只要事務提交成功,那麼事務對資料庫的操作就是一個永久性的作用,不會存在提交後,由於系統的原因,導致操作的效果消失了。
I :Isolation 隔離性
資料庫存在多個事務同時操作時,應該保證事務時間互相不干擾,操作互相不影響。
如果像java語言中通過同步鎖線性的操作,隔離性的問題肯定可以解決,但是這樣操作就導致事務都是序列操作,效率低下,因此可以通過適當的調整隔離性,也就是事務互相之間的可見性的程度,來更好的提高效能。這就是隔離性所牽扯到一個隔離級別的問題,後邊的部落格中我們會講到。
C:Consistency 一致性
一致性相對於其他特性來說最不容易理解,所以我們放到最後來講。
所謂的一致性指的是資料庫中的約束不會被打破,這種約束指兩部分,
第一資料庫的約束,如金額不能為負值。外來鍵的約束
第二業務的約束,金額的轉出的總額和轉入的總額必須要相等。
這裡有一個點,很多文章都解釋的不夠清楚,覺得一致性是指事務中不同的操作的狀態要一致,這個只是字面意思,而字面意思又因為翻譯的問題被曲解。所以很多人覺得一致性和原子性的概念很容易混淆,原因就在這裡。更不理解為什麼說一致性的是AID三個特性的最終目的。(防盜連線:本文首發自http://www.cnblogs.com/jilodream/ )所以更正確的理解應該是資料庫事務操作後應該與約束保持一致,這就都理解通了。
所以特別要注意,這裡的Consistentcy與CAP中的C不是一層含義。而是指資料庫事務的操作,應該與業務要求保持一致。再囉嗦點,就是說,一致性是指資料要和預期的狀態保持一致。因此在嚴格的意義上來說,一致性並不是資料庫的特性,而是應用層(目的)的特性。