原子性(Atomicity)html
原子性要求事務所包含的所有操做是一個不可分割的總體,這些操做要麼所有提交成功,要麼只要其中一個操做失敗,就所有「成仁」數據庫
一致性(Consistency)安全
一致性要求事務所包含的操做不能違反數據資源的一致性檢查,數據資源在事務執行以前處於一個數據的一致性狀態,那麼,事務執行以後也須要依然保持數據間的一致性狀態併發
隔離性(ISOlation)性能
事務的隔離性主要規定了各個事務之間相互影響的程度。隔離性概念主要面向對數據資源的併發訪問(Concurrency),併兼顧影響事務的一致性。當兩個事務或者更多事務同時訪問同一數據資源的時候,不一樣的隔離級別決定了各個事務對該數據資源訪問的不一樣行爲。htm
咱們能夠爲事務指定四種類型的隔離級別,隔離程度按照從弱到強分別爲「Read Uncommitted」,「Read Committed」,「Repeatable Read」和「Serializable」:
- Read Uncommitted. 最低的隔離級別,Read Uncommitted最直接的效果就是一個事務能夠讀取另外一個事務並未提交的更新結果。
Read Uncommitted是以較低的隔離度來尋求較高的性能,其自己沒法避免如下幾個問題:
- 髒讀(Dirty Read). 若是一個事務中對數據進行了更新,但事務尚未提交,另外一個事務能夠「看到」該事務沒有提交的更新結果,這樣形成的問題就是,若是第一個事務回滾,那麼,第二個事務在此以前所「看到」的數據就是一筆髒數據。
- 不可重複讀取(Non-Repeatable Read). 不可重複讀取是指同一個事務在整個事務過程當中對同一筆數據進行讀取,每次讀取結果都不一樣。若是事務1在事務2的更新操做以前讀取一次數據,在事務2的更新操做以後再讀取同一筆數據一次,兩次結果是不一樣的,因此,Read Uncommitted也沒法避免不可重複讀取的問題。
- 幻讀(Phantom Read)[3]. 幻讀是指一樣一筆查詢在整個事務過程當中屢次執行後,查詢所得的結果集是不同的。幻讀針對的是多筆記錄。在Read Uncommitted隔離級別下, 無論事務2的插入操做是否提交,事務1在插入操做以前和以後執行相同的查詢,取得的結果集是不一樣的,因此,Read Uncommitted一樣沒法避免幻讀的問題。
- Read Committed(一般是大部分數據庫採用的默認隔離級別),它在Read Uncommitted 隔離級別的基礎上所作的限定更進一步,在該隔離級別下,一個事務的更新操做結果只有在該事務提交以後,另外一個事務纔可能讀取到同一筆數據更新後的結果。因此Read Committed能夠避免Read UnCommitted隔離級別下存在的髒數據問題,但沒法避免不可重複讀取和幻讀的問題。
- Repeatable Read Repeatable Read隔離級別能夠保證在整個事務的過程當中,對同一筆數據的讀取結果是相同的,無論其餘事務是否同時在對同一筆數據進行更新,也無論其餘事務對同一筆數據的更新提交與否。 Repeatable Read隔離級別避免了髒讀和不可重複讀取的問題,但沒法避免幻讀。
- Serializable 最爲嚴格的隔離級別,全部的事務操做都必須依次順序執行,能夠避免其餘隔離級別遇到的全部問題,是最爲安全的隔離級別, 但同時也是性能最差的隔離級別,由於全部的事務在該隔離級別下都須要依次順序執行,因此,併發度降低,吞吐量上不去,性能天然就下來了。 由於該隔離級別極大的影響系統性能,因此,不多場景會使用它。一般狀況下,咱們會使用其餘隔離級別加上相應的併發鎖的機制來控制對數據的訪問,這樣既保證了系統性能不會損失太大,也可以必定程度上保證數據的一致性
==在具體的實踐中,咱們須要根據系統的具體狀況來調整隔離度以保證系統性能與數據一致性之間的一個良好的平衡,但總的來講,保證數據的一致性的考慮應該優先於對系統性能的考慮。==blog
持久性(Durability)事務
事務的持久性是指一旦整個事務操做成功提交完成,對數據所作的變動將被記載並不可逆轉
Spring事務ci