一、什麼是Transactional Propagation
Transactional Propagation 是 Spring 事務的重要概念之一,主要解決了多個事務方法之間相互調用時事務的傳遞問題。簡單來說,如果一個事務方法 A 中調用了另一個事務方法 B,那麼 Transactional Propagation 就是決定了這兩個事務方法將如何交互,以及事務該如何傳遞。事務的傳遞可以分為多種類型,Spring 提供了多種固定的Propagation屬性,用戶可以根據自己的需要選擇合適的傳播方式。
二、Propagation屬性介紹
Spring 提供了如下 7 種 Propagation 屬性:
- Propagation.REQUIRED:如果當前方法正在運行在一個事務中,則方法 B 將在這個事務中運行。否則,方法 B 也將啟動一個新的事務,並在自己的事務中運行。
- Propagation.SUPPORTS:如果當前方法正在運行在一個事務中,則方法 B 也將在這個事務中運行。否則,它將以非事務的方式執行。
- Propagation.MANDATORY:如果當前方法正在運行在一個事務中,則方法 B 將在這個事務中運行。否則,它將拋出異常。
- Propagation.REQUIRES_NEW:無論當前方法是否在事務中運行,都將為方法 B 開啟一個新的事務。
- Propagation.NOT_SUPPORTED:無論當前方法是否在事務中運行,方法 B 都將以非事務的方式執行。
- Propagation.NEVER:如果當前方法正在運行在一個事務中,則方法 B 將拋出異常。
- Propagation.NESTED:如果當前方法正在運行在一個事務中,則方法 B 將在這個事務的嵌套事務中運行。否則,它將啟動一個新的事務,並在自己的事務中運行。
三、Propagation屬性示例
假設有兩個方法 A 和 B,它們都開啟了事務。現在我們來看看不同的 Propagation 屬性將如何影響它們之間的交互:
1. PROPAGATION_REQUIRED
@Transactional(propagation = Propagation.REQUIRED) public void methodA() { // do some database operations methodB(); } @Transactional(propagation = Propagation.REQUIRED) public void methodB() { // do some other database operations }
如果 methodA 在一個事務中運行,那麼 methodB 也將在同一個事務中運行,它們將使用同一個數據庫連接。如果 methodA 沒有在一個事務中運行,那麼 methodB 將使用自己的事務,它將開啟一個新的數據庫連接。
2. PROPAGATION_SUPPORTS
@Transactional(propagation = Propagation.REQUIRED) public void methodA() { // do some database operations methodB(); } @Transactional(propagation = Propagation.SUPPORTS) public void methodB() { // do some other database operations }
如果 methodA 在一個事務中運行,那麼 methodB 也將在同一個事務中運行,它們將使用同一個數據庫連接。如果 methodA 沒有在一個事務中運行,那麼 methodB 將以非事務方式運行,它將使用自己的數據庫連接。
3. PROPAGATION_MANDATORY
@Transactional(propagation = Propagation.REQUIRED) public void methodA() { // do some database operations methodB(); } @Transactional(propagation = Propagation.MANDATORY) public void methodB() { // do some other database operations }
如果 methodA 在一個事務中運行,那麼 methodB 也將在同一個事務中運行,它們將使用同一個數據庫連接。如果 methodA 沒有在一個事務中運行,那麼 methodB 將拋出異常。
4. PROPAGATION_REQUIRES_NEW
@Transactional(propagation = Propagation.REQUIRED) public void methodA() { // do some database operations methodB(); } @Transactional(propagation = Propagation.REQUIRES_NEW) public void methodB() { // do some other database operations }
無論 methodA 是否在一個事務中運行,methodB 都將開啟一個新的獨立事務,它們將使用不同的數據庫連接。
5. PROPAGATION_NOT_SUPPORTED
@Transactional(propagation = Propagation.REQUIRED) public void methodA() { // do some database operations methodB(); } @Transactional(propagation = Propagation.NOT_SUPPORTED) public void methodB() { // do some other database operations }
如果 methodA 在一個事務中運行,那麼 methodB 將以非事務方式運行,它將使用自己的數據庫連接。如果 methodA 沒有在一個事務中運行,那麼 methodB 也將以非事務方式運行,它將使用自己的數據庫連接。
6. PROPAGATION_NEVER
@Transactional(propagation = Propagation.REQUIRED) public void methodA() { // do some database operations methodB(); } @Transactional(propagation = Propagation.NEVER) public void methodB() { // do some other database operations }
如果 methodA 在一個事務中運行,那麼 methodB 將拋出異常。如果 methodA 沒有在一個事務中運行,那麼 methodB 將以非事務方式運行,它將使用自己的數據庫連接。
7. PROPAGATION_NESTED
@Transactional(propagation = Propagation.REQUIRED) public void methodA() { // do some database operations methodB(); } @Transactional(propagation = Propagation.NESTED) public void methodB() { // do some other database operations }
如果 methodA 在一個事務中運行,那麼 methodB 將在該事務的嵌套事務中運行,它們將使用同一個數據庫連接。如果 methodA 沒有在一個事務中運行,那麼 methodB 將開啟一個新的獨立事務,它將使用自己的數據庫連接。
四、小結
Transactional Propagation 在 Spring 事務中是非常重要的一部分,它決定了不同事務方法之間的交互方式,以及事務該如何傳遞。Spring 提供了 7 種 Propagation 屬性,用戶可以根據自己的需要選擇合適的傳播方式。當我們理解了這些 Propagation 屬性的含義和影響後,我們就可以更好地設計我們的事務系統,確保數據的完整性和一致性。
原創文章,作者:NEHMP,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/371210.html