事務基礎

事務簡介

事務就是以可控的方式對數據資源進行訪問的一組操作。事務本身持有4個限定屬性:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)和持久性(Durability),這也就是常說的事務的ACID屬性。

1.原子性
原子性要求事務所包含的全部操作是一個不可分割的整體,這些操作要麼全部提交成功,要麼只要其中一個操作失敗,就全部失敗。
2.一致性
一致性要求事務所包含的操作不能違反數據資源的一致性檢查,數據資源在事務執行之前處於某個數據一致性狀態,那麼事務執行之後也依然需要保持數據間的一致性狀態。
3.隔離性
事務的隔離性主要規定了事務之間相互影響的程度。隔離性概念主要面向對數據資源的併發訪問,併兼顧影響事務的一致性。當兩個事務或者更多事務同時訪問同一個數據資源的時候,不同的隔離級別決定了各個事務對該數據資源訪問的不同行爲。
隔離程度從弱到強分別爲:
  • Read Uncommmitted。它是最低的隔離級別,一個事務可以讀取另一個事務沒有提交的更新結果。Read Uncommitted是以較低的隔離度來尋求較高的性能,其本身無法避免以下幾個問題。

    • 髒讀(Dirty Read)。如果一個事務對數據進行了更新,但事務還沒有提交,另一個事務就可以“看到”該事務沒有提交的更新結果。這樣造成的問題就是,如果一個事務回滾,那麼第二個事務在此之前“看到”的數據就是一筆髒數據。
    • 不可重複讀(Non-Repeatable Read)。是指同一個事務在整個事務過程中對同一筆數據進行讀取,每次讀取結果都不同。如果事務1在事務2的更新操作之前讀取一次數據,在事務2的更新操作之後再讀取同一筆數據一次,兩次結果不同。所以,Read Uncommitted也無法避免不可重複讀取的問題。
    • 幻讀(Phantom Read)。是指同樣一個查詢在整個事務過程中多次執行後,查詢所得的結果集是不一樣的。幻讀針對的是多筆記錄。在Read Uncommitted隔離級別下,不管事務2的插入操作是否提交,事務1在插入操作之前和之後執行相同的查詢,取得的結果集是不同的。所以,Read Uncommitted同樣無法避免幻讀的問題。
  • Read Committed。通常,Read Committed是大部分數據庫採用的默認隔離級別,它比Read Uncommitted隔離級別擁有更高級別的限定。在該隔離級別下,一個事務的更新操作結果只有在該事務提交之後,另一個事務纔可能讀取到同一筆數據更新後的結果。

  • Repeatable Read。可以保證在整個事務過程中,對同一筆數據的讀取結果是相同的。不管其他事務是否同時在對同一筆數據進行更新,也不管其他事務對同一筆數據的更新提交與否。Repeatable Read隔離級別避免了髒讀和不可重複讀問題,但是無法避免幻讀。

  • Serializable。它是最爲嚴格的隔離級別。所有的事務操作都必須依次順序執行,可以避免其他隔離級別遇到的所有問題,是最爲安全的隔離級別,但同時也是性能最差的級別。通常情況下,我們會使用其他隔離級別加上相應的併發鎖的機制來控制對數據的訪問,這樣既保證了系統性能不會損失太大,也能夠在一定程度上保證數據的一致性。

    隔離級別與系統的併發性成反比,與數據一致性成正比。

4.持久性
事務的持久性是指,一旦整個事務操作成功提交,對數據所做的變更將被記載並不可逆轉。

事務的傳播行爲

  • PROPAGATION_REQUIRED。如果當前存在一個事務,則加入當前事務。如果不存在任何事務,則創建一個新的事務。通常作爲默認的事務傳播行爲。
  • PROPAGATION_SUPPORTS。如果當前存在一個事務,則加入當前事務。如果不存在事務,則直接執行。通常比較適合查詢方法。
  • PROPAGATION_MANDATORY。強制要求當前存在一個事務,如果不存在,則拋出異常。
  • PROPAGATION_REQUIRES_NEW。不管當前是否存在事務,都會創建新的事務。當某個業務對象所做的事情不想影響到外層事務是選擇。
  • PROPAGATION_NOT_SUPPORTED。不支持當前事務,在沒有事務的情況下執行。如果當前存在事務的話,當前事務原則上將被掛起。
  • PROPAGATION_NEVER。永遠不需要當前存在事務,如果存在當前事務,則拋出異常。
  • PROPAGATION_NESETD。如果存在當前事務,則在當前事務的一個嵌套事務中執行。否則與PROPAGATION_REQUIRED行爲相似,即創建新的事務。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章