1、事務:事務就是一可控的方式對數據資源訪問的一組操做。爲了保證事務操做先後,數據資源所承載的系統狀態始終處於「正確」的狀態,數據庫
事務自己持有4個限定屬性,即原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)和持久性(Durability),這也是常說的事務的ACID屬性。安全
1.原子性:原子性要求事務所包含的全部操做是一個不可分割的總體,這些操做,這些操做要麼所有操做成功,只要有一個失敗,就所有失敗。併發
2.一致性:一致性要求事務所包含的操做不能違反數據資源的一致性檢查,數據資源在事務執行以前處於摸個數據一致性狀態,那麼,事務執行以後也依然須要保持數據間一致性狀態。例如:銀行轉帳,A用戶想B用戶轉帳500元。那麼A用戶帳戶減小500元,B用戶帳戶多500元。若是事務操做結束,整個數據狀態不是這個樣子,那麼系統就處於不一致狀態。性能
3.隔離性:事務的隔離性主要規定了各個事務之間相互影響程度。隔離性概念主要面向數據庫併發訪問,併兼顧影響事務的一致性。當兩個事務或者更多事務同事訪問贊成數據資源的時候,不一樣的隔離級別決定了各個事務對該數據資源訪問的不一樣行爲。事務的隔離級別主要有四種,從弱到強分別爲Read Uncommitted、Read Committed、Repeatable Read和Serializable。大數據
Read Uncommitted :它是最低的隔離級別。Read Uncommitted最直接的效果就是,一個事物能夠讀取另外一個事務沒有提交的更新結果。Read Uncommitted是以較低的隔離度來尋求較高的性能,其自己沒法避免如下幾個問題。spa
髒讀(Dirty Read):若是一個事務對數據進行更新,可是事務尚未提交,另外一個事務就能夠「看到」該事務滅有提交的更新結果。這樣形成的問題就是,若是第一個事務回滾,那麼第二個事務再次以前所「看到」的數據就是一筆髒據。事務
不可重複讀(Non-Repeatable Read):不可重複讀是指同一個事務在整個事務過程當中對同一筆數據進行讀取,每次讀取結果都不一樣。若是事務1在事務2的更新操做以前讀取一次數據,在事務2的更新操做以後在讀取同一筆數據,兩次結果是不一樣的。因此Read Uncommitted也沒法避免不可重複讀取的問題。ci
幻讀(Phantom Read):幻讀是指同一個查詢在整個事務過程當中屢次執行後,查詢所得的結果是不同的。幻讀針對的是多筆記錄。在Read Uncommitted隔離級別下,無論事務2的插入操做是否提交,事務1在插入操做以前和以後執 行相同的查詢,取得的結果是不一樣的,因此,Read Uncommitted是沒法避免幻讀問題。資源
Read Committed:Read Committed是大多數數據庫的默認隔離級別。在該隔離級別下,一個事務的更新操做結果只有在該事務提交以後,另外一個事務纔可能讀取到同一筆數據更新後的結果。因此,Read Committed能夠避免Read Uncommitted 隔離級別下 存在髒讀問題,可是沒法避免不可重複讀和幻讀問題。it
Repeatable Read:Repeatable Read隔離級別能夠保證在整個事務中,對同一筆數據的讀取結果是相同的,無論其餘事務是否同時在對同一筆數據進行更新操做,也無論其餘事務對同一筆數據的更新提交與否。Repeatable Read隔離級別避免了髒讀和不可 重複讀問題,可是沒法避免幻讀。
Serializable:它是最嚴格的隔離級別,全部事務操做都必須一次按順序執行,能夠避免其餘隔離級別遇到的全部問題。,是最安全的隔離級別,但同時也是性能最差的隔離級別。全部事務依次按順序執行,併發度降低,吞吐量上不去。
對於數據庫來講,一般都有一個默認的隔離級別,大數據狀況下都是Read Committed。並且,並不是全部的數據都支持這四種隔離級別,好比Oracle只支持Read Committed和Serializable。若是指定的隔離級別當前數據不支持,那麼數據庫會採用默認的隔離級別代替指定的隔離級別。Spring、JDBC等數據訪問方式,都容許咱們爲事務指定隔離級別,可是最終事務是否以指定的隔離級別執行,則由底層數據庫來決定。
隔離程度與併發性、一致性之間的關係:
4.持久性:事務的持久性是指,一旦整個事務操做成功提交,對數據所作的變動將被記錄並不可逆轉。