最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在同一個類中調(diào)用帶有@Transactional注解的方法示例

 更新時間:2023年04月27日 09:40:32   作者:鏡花水月550  
這篇文章主要為大家介紹了在同一個類中調(diào)用帶有@Transactional注解的方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

將調(diào)用方法和被調(diào)用方法分開

分別使用 @Transactional 注解來管理事務

推薦這個方法\color{red}{推薦這個方法}推薦這個方法

@Service
@Transactional
public class MyService {
    @Autowired
    private MyRepository myRepository;
    public void foo() {
        // 在此調(diào)用 bar 方法,事務將自動傳播
        bar();
    }
    public void bar() {
        // 這里是被調(diào)用的方法,也添加 @Transactional 注解來管理事務
        myRepository.save(new MyEntity());
    }
}

使用 AspectJ 的方式

  • 在同一個類中通過調(diào)用代理對象的方式來保證事務生效。

需要注意的是,使用 AopContext.currentProxy() 需要開啟 Spring 的 AspectJ 支持,

@Service
@Transactional
public class MyService {
    @Autowired
    private MyRepository myRepository;
    public void foo() {
        // 在此調(diào)用 bar 方法,事務將生效
        ((MyService) AopContext.currentProxy()).bar();
    }
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    private void bar() {
        // 這里是被調(diào)用的方法,使用 REQUIRES_NEW 傳播行為開啟一個新的事務
        myRepository.save(new MyEntity());
    }
}
  • 在同一個類中注入自身實例,并通過這個實例調(diào)用被調(diào)用方法,保證事務生效。

需要注意的是,這種方式雖然可以保證事務生效,但是需要在同一個類中注入自己,不太符合面向?qū)ο蟮脑O計原則

@Service
@Transactional
public class MyService {
    @Autowired
    private MyRepository myRepository;
    @Autowired
    private MyService self;
    public void foo() {
        // 在此調(diào)用 bar 方法,事務將自動傳播
        self.bar();
    }
    public void bar() {
        // 這里是被調(diào)用的方法,也添加 @Transactional 注解來管理事務
        myRepository.save(new MyEntity());
    }
}

使用 Spring 提供的 TransactionTemplate

  • 在同一個類中通過編程式事務處理的方式來保證事務生效。
@Service
@Transactional
public class MyService {
    @Autowired
    private MyRepository myRepository;
    @Autowired
    private TransactionTemplate transactionTemplate;
    public void foo() {
        // 在此調(diào)用 bar 方法,事務將生效
        transactionTemplate.execute(new TransactionCallback<Void>() {
            @Override
            public Void doInTransaction(TransactionStatus status) {
                // 在此執(zhí)行需要在事務中完成的邏輯
                myRepository.save(new MyEntity());
                return null;
            }
        });
    }
}

其中,MyRepository 是一個 JPA Repository 接口,用于操作數(shù)據(jù)庫;MyEntity 是一個實體類,代表一個數(shù)據(jù)庫表。

使用Spring的AOP功能來保證事務生效。

在同一個類中調(diào)用方法時,因為沒有經(jīng)過Spring代理,所以無法使用 @Transactional 注解來管理事務。但是,可以使用AspectJ的注解方式來實現(xiàn)事務的控制。

下面是一個示例代碼,用于在同一個類中調(diào)用方法時,保證事務生效:

@Component
@Aspect
public class TransactionalAspect {
    @Autowired
    private PlatformTransactionManager transactionManager;
    @Pointcut("@annotation(org.springframework.transaction.annotation.Transactional)")
    public void transactionalMethod() {}
    @Around("transactionalMethod()")
    public Object manageTransaction(ProceedingJoinPoint pjp) throws Throwable {
        DefaultTransactionDefinition definition = new DefaultTransactionDefinition();
        definition.setName(pjp.getSignature().getName());
        definition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
        TransactionStatus status = transactionManager.getTransaction(definition);
        try {
            Object result = pjp.proceed();
            transactionManager.commit(status);
            return result;
        } catch (Throwable t) {
            transactionManager.rollback(status);
            throw t;
        }
    }
}

上述示例代碼中,定義了一個名為TransactionalAspect的切面類,使用@Aspect注解進行標注。在切面類中,定義了一個名為transactionalMethod的切點,用于匹配所有使用@Transactional注解標記的方法。

在manageTransaction方法中,使用TransactionTemplate手動開啟一個新的事務,并在事務中執(zhí)行被調(diào)用的方法。如果被調(diào)用的方法執(zhí)行成功,則提交事務;如果被調(diào)用的方法發(fā)生異常,則回滾事務。

需要注意的是,這種方式雖然可以實現(xiàn)事務的控制,但是需要手動管理事務,增加了代碼的復雜度和維護成本。因此,建議將調(diào)用方法和被調(diào)用方法分開,使用 @Transactional 注解來管理事務,以便更好地維護和管理代碼。

以上就是在同一個類中調(diào)用帶有@Transactional注解的方法示例的詳細內(nèi)容,更多關于類調(diào)用@Transactional注解的資料請關注腳本之家其它相關文章!

相關文章

  • 詳解Java內(nèi)部類與對象的打印概念和流程

    詳解Java內(nèi)部類與對象的打印概念和流程

    在 Java 中,可以將一個類定義在另一個類里面或者一個方法里面,這樣的類稱為內(nèi)部類。廣泛意義上的內(nèi)部類一般來說包括這四種:成員內(nèi)部類、局部內(nèi)部類、匿名內(nèi)部類和靜態(tài)內(nèi)部類
    2021-10-10
  • MyBatis分頁查詢返回list的時候出現(xiàn)null的問題

    MyBatis分頁查詢返回list的時候出現(xiàn)null的問題

    這篇文章主要介紹了MyBatis分頁查詢返回list的時候出現(xiàn)null的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • 實例講解Java并發(fā)編程之變量

    實例講解Java并發(fā)編程之變量

    這篇文章主要介紹了實例講解Java并發(fā)編程之變量,本文講解了編寫線程安全需要關心的共享變量和可變變量,需要的朋友可以參考下
    2015-04-04
  • IntelliJ IDEA(或者JetBrains PyCharm)中彈出

    IntelliJ IDEA(或者JetBrains PyCharm)中彈出"IntelliJ IDEA License

    今天小編就為大家分享一篇關于IntelliJ IDEA(或者JetBrains PyCharm)中彈出"IntelliJ IDEA License Activation"的解決辦法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • 在Spring項目中引入高版本依賴并解決低版本沖突問題的解決方法

    在Spring項目中引入高版本依賴并解決低版本沖突問題的解決方法

    在Spring項目的開發(fā)過程中,依賴管理是一個非常重要且復雜的問題,我們可能需要引入更高版本的依賴來使用新特性或修復舊版本的Bug,然而,這些高版本依賴可能會與項目中已有的低版本依賴產(chǎn)生沖突,本文將詳細探討如何在Spring中引入高版本依賴,并解決低版本依賴沖突的問題
    2025-03-03
  • 如何理解SpringMVC

    如何理解SpringMVC

    Spring Web MVC是一種基于Java的實現(xiàn)了Web MVC設計模式的請求驅(qū)動類型的輕量級Web框架,即使用了MVC架構(gòu)模式的思想,將web層進行職責解耦,基于請求驅(qū)動指的就是使用請求-響應模型,框架的目的就是幫助我們簡化開發(fā)
    2021-06-06
  • Java利用cors實現(xiàn)跨域請求實例

    Java利用cors實現(xiàn)跨域請求實例

    本篇文章主要介紹了Java利用cors實現(xiàn)跨域請求實例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • Java ArrayList的不同排序方法

    Java ArrayList的不同排序方法

    這篇文章主要介紹了Java ArrayList的不同排序方法,感興趣的小伙伴們可以參考一下
    2015-12-12
  • Java 獲取服務器環(huán)境的實例詳解

    Java 獲取服務器環(huán)境的實例詳解

    這篇文章主要介紹了Java 獲取服務器環(huán)境的實例詳解的相關資料,這里提供實例和輸出結(jié)果,希望能幫助大家理解,需要的朋友可以參考下
    2017-07-07
  • SpringBoot如何訪問本地圖片

    SpringBoot如何訪問本地圖片

    這篇文章主要介紹了SpringBoot如何訪問本地圖片問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08

最新評論

滦南县| 成安县| 当阳市| 广德县| 岳池县| 南京市| 勃利县| 兴安盟| 石台县| 武乡县| 洞口县| 东城区| 安宁市| 汉寿县| 小金县| 辉县市| 仙居县| 上杭县| 宜都市| 杭锦后旗| 平潭县| 昌黎县| 华宁县| 濮阳县| 珲春市| 道真| 馆陶县| 松滋市| 海兴县| 电白县| 鄂温| 澄江县| 龙江县| 兴仁县| 巫溪县| 揭西县| 共和县| 瑞安市| 沙雅县| 卓资县| 上蔡县|