1. 程式人生 > 其它 >Spring事務傳播特性

Spring事務傳播特性

場景:假設有這樣一段程式碼,兩個方法都有事務,a()方法呼叫b()方法。

注意:如果兩個有事務的方法在同一個bean裡面,不能直接用 this.b(); 去呼叫b方法,否則會失效,因為Spring事務是基於AOP的動態代理實現的,要想讓事務正常執行,需要用代理物件去呼叫b方法,而不能用真實物件去執行,而這裡的 this 就是真實物件。

@Service
public class Demo {
    @Transactional
    public void a() {
        System.out.println("AAAAAAAA..");
        //        注意這裡不能用 this.b(); 去呼叫b方法,否則b方法的事務會失效
        Demo demo = (Demo) AopContext.currentProxy();
        demo.b();
    }

    @Transactional
    public void b() {
        System.out.println("BBBBBBBB..");
    }
}
  • required
    如果a方法有事務,那b就用a的事務,如果a沒有,那b就建立一個事務

  • supports

    支援事務,如果當前有事務則加入到這個事務,沒有則以非事務的方式執行

    假設b方法是supports,如果a方法有事務,則加入到a方法的事務,如果a沒有事務,則b就相當於一個普通方法(沒有事務的方法)

  • mandatory

    支援當前事務,如果不存在事務則丟擲異常

    假設b是mandatory,如果a方法沒有事務,b就會丟擲異常

  • requires_new

    開啟一個新事物,如果當前有事務則掛起

    不管a方法有沒有事務,b方法都要新建一個事務,兩個事務相互獨立,如果b出現異常,回滾事務,但是不影響a事務

  • not_supported

    不支援事務,總是以非事務的方式執行

    a有事務,b是not_supported,b總以非事務的方式執行

  • never

    不支援事務,如果當前有事務就直接丟擲異常

    a有事務,b的事務是never,如果a呼叫b,則b會丟擲異常

  • nested

    如果當前事務存在,則在巢狀事務中執行,否則類似於required

本文來自部落格園,作者:祖國滴粑粑花,轉載請註明原文連結:https://www.cnblogs.com/rxx1005/p/15948141.html