數據庫事務(Transaction)是指做爲單個邏輯工做單元執行的一系列操做,要麼徹底地執行,要麼徹底地不執行。一方面,當多個應用程序併發訪問數據庫時,事務能夠在應用程序間提供一個隔離方法,防止互相干擾。另外一方面,事務爲數據庫操做序列提供了一個從失敗恢復正常的方法。 數據庫
事務具備四個特性:原子性(Atomicity)、一致性(Consistency)、隔離型(Isolation)、持久性(Durability),簡稱ACID。 併發
事務的原子性是指事務中的操做不可拆分,只容許所有執行或者所有不執行。 性能
事務的一致性是指事務的執行不能破壞數據庫的一致性,一致性也稱爲完整性。一個事務在執行後,數據庫必須從一個一致性狀態轉變爲另外一個一致性狀態。 spa
事務的隔離型是指併發的事務相互隔離,不能互相干擾。 事務
事務的持久性是指事務一旦提交,對數據的狀態變動應該被永久保存。 ci
實際工做中事務幾乎都是併發的,徹底作到互相之間不干擾會嚴重犧牲性能,爲了平衡隔離型和性能,SQL92規範定義了四個事務隔離級別:讀未提交(Read Uncommitted)、讀已提交(Read Committed)、可重複讀(Repeatable Read)、串行化(Serializable)。四個級別逐漸加強,每一個級別解決上個級別的一個問題。 it
另外一個事務修改了數據,但還沒有提交,而本事務中的SELECT會讀到這些未被提交的數據(髒讀)。 io
髒讀是指另外一個事務修改了數據,但還沒有提交,而本事務中的SELECT會讀到這些未被提交的數據。
table
本事務讀取到的是最新的數據(其餘事務提交後的)。問題是,在同一個事務裏,先後兩次相同的SELECT會讀到不一樣的結果(不可重複讀)。 程序
不可重複讀是指同一個事務執行過程當中,另一個事務提交了新數據,所以本事務前後兩次讀到的數據結果會不一致。
在同一個事務裏,SELECT的結果是事務開始時間點的狀態,一樣的SELECT操做讀到的結果會是一致的。可是,會有幻讀現象。
不可重複讀保證了同一個事務裏,查詢的結果都是事務開始時的狀態(一致性)。可是,若是另外一個事務同時提交了新數據,本事務再更新時,就會發現了這些新數據,貌似以前讀到的數據是幻覺,這就是幻讀。
全部事務只能一個接一個串行執行,不能併發。
事務隔離級別越高,越能保證數據的一致性,但對併發性能影響越大,一致性和高性能必須有所取捨或折中。
通常狀況下,多數應用程序能夠選擇將數據庫的隔離級別設置爲讀已提交,這樣能夠避免髒讀,也能夠獲得不錯的併發性能。儘管這個隔離級別會致使不可重複度、幻讀,但這種個別場合應用程序能夠經過主動加鎖進行併發控制。