事務的基礎知識

背景

  1. 爲什麼有事務的概念?
  2. 事務的基礎概念是什麼?
  3. 事務在MySQL中是怎麼回事?
  4. 事務在Spring中是怎麼回事?

過程

  • 事務的來源

    張三要轉錢給李四。在這個過程中會有多個步驟,查詢張三的餘額,張三做減法並且更新餘額,而李四做加法並更新餘額。

    上面描述的過程,必須要保證是一個整體,要麼都失敗,要麼都成功,不允許部分成功。

    爲了保證這樣的邏輯。於是引出了事務這樣的概念。

  • 事務的基礎概念

    事務:保證一組數據庫操作,要麼全部成功,要麼全部失敗。

    事務:有4大性質。ACID(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔離性、持久性)

    原子性: 一些列的操作,一些列步驟都是一個整體。

    一致性: 執行前後一定要保證數據的合理性。

    隔離性:事務與事務之間是相互獨立的。這裏的隔離性就是描述了事務之間的隔離級別。

    持久性: 把最終的結果的數據持久化到數據庫中或者磁盤上。

  • MySQL中的隔離級別 (事務的基礎概念隔離性的實踐)

    讀未提交:一個事務還未提交,它做的變更能被別的事務看到。

    讀提交:一個事務提交之後,它做的變更纔會被其他事務看到。

    可重複讀:一個事務執行過程中看到的數據,總是跟這個事務在啓動時看到的數據是一致的。在可重複讀隔離級別下,未提交變更對其他事務也是不可見的。

    串行化:對同一行記錄,寫加寫鎖,讀加讀鎖。當出現讀寫鎖衝突的時候,後訪問的事務必須等前一個事務執行完成,才能繼續執行。

  • Spring中的Transactional的基礎知識 Spring定義的七種傳播行爲

  1. REQUIRED:當前方法必須運行在事務中。如果當前事務存在,方法將會在該事務中運行。否則,會啓動一個新的事務。
  2. SUPPORTS:當前方法不需要事務上下文,但是如果存在當前事務的話,那麼該方法會在這個事務中運行。
  3. MANDATORY:該方法必須在事務中運行,如果當前事務不存在,則會拋出一個異常。
  4. REQUIRED_NEW:當前方法必須運行在它自己的事務中。一個新的事務將被啓動。如果存在當前事務,在該方法執行期間,當前事務會被掛起。如果使用JTATransactionManager的話,則需要訪TransactionManager
  5. NOT_SUPPORTED:該方法不應該運行在事務中。如果存在當前事務,在該方法運行期間,當前事務將被掛起。如果使用JTATransactionManager的話,則需要訪問TransactionManager
  6. NEVER:當前方法不應該運行在事務上下文中。如果當前正有一個事務在運行,則會拋出異常。
  7. NESTED:如果當前已經存在一個事務,那麼該方法將會在嵌套事務中運行。嵌套事務可以獨立於當前事務進行單獨地提交或回滾。如果當前事務不存在,那麼其行爲與PROPAGETION_REQUIRED一樣。注意各廠商對這種傳播行爲是有所差異的。可以參考資源管理器的文檔來確認他們是否支持嵌套事務。

小結

  1. 總結有關事務的基礎知識。
  2. 記錄Spring定義的7種傳播行爲。
  3. Spring中的註解@Transactional在哪些情況下會失效呢?
  4. 代碼邏輯層面其實只有的概念,而事務的概念和隔離級別其實是關係型數據的概念。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章