欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

分別使用 @Transactional 注解來(lái)管理事務(wù)

推薦這個(gè)方法\color{red}{推薦這個(gè)方法}推薦這個(gè)方法

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

使用 AspectJ 的方式

  • 在同一個(gè)類中通過調(diào)用代理對(duì)象的方式來(lái)保證事務(wù)生效。

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

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

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

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

使用 Spring 提供的 TransactionTemplate

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

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

使用Spring的AOP功能來(lái)保證事務(wù)生效。

在同一個(gè)類中調(diào)用方法時(shí),因?yàn)闆]有經(jīng)過Spring代理,所以無(wú)法使用 @Transactional 注解來(lái)管理事務(wù)。但是,可以使用AspectJ的注解方式來(lái)實(shí)現(xiàn)事務(wù)的控制。

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

@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;
        }
    }
}

上述示例代碼中,定義了一個(gè)名為TransactionalAspect的切面類,使用@Aspect注解進(jìn)行標(biāo)注。在切面類中,定義了一個(gè)名為transactionalMethod的切點(diǎn),用于匹配所有使用@Transactional注解標(biāo)記的方法。

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

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

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

相關(guān)文章

  • 手動(dòng)部署java項(xiàng)目到k8s中的實(shí)現(xiàn)

    手動(dòng)部署java項(xiàng)目到k8s中的實(shí)現(xiàn)

    本文主要介紹了手動(dòng)部署java項(xiàng)目到k8s中的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Spring Boot 3.x 全新的熱部署配置方式詳解(IntelliJ IDEA 2023.1)

    Spring Boot 3.x 全新的熱部署配置方式詳解(IntelliJ ID

    這篇文章主要介紹了Spring Boot 3.x 全新的熱部署配置方式(IntelliJ IDEA 2023.1),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • Java 使用Axis調(diào)用WebService的示例代碼

    Java 使用Axis調(diào)用WebService的示例代碼

    這篇文章主要介紹了Java 使用Axis調(diào)用WebService的示例代碼,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-09-09
  • Java聊天室之使用Socket實(shí)現(xiàn)傳遞對(duì)象

    Java聊天室之使用Socket實(shí)現(xiàn)傳遞對(duì)象

    這篇文章主要為大家詳細(xì)介紹了Java簡(jiǎn)易聊天室之使用Socket實(shí)現(xiàn)傳遞對(duì)象功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以了解一下
    2022-10-10
  • 基于Java8實(shí)現(xiàn)提高Excel讀寫效率

    基于Java8實(shí)現(xiàn)提高Excel讀寫效率

    這篇文章主要介紹了基于Java8實(shí)現(xiàn)提高Excel讀寫效率,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • SpringCloud之熔斷器Hystrix的實(shí)現(xiàn)

    SpringCloud之熔斷器Hystrix的實(shí)現(xiàn)

    這篇文章主要介紹了SpringCloud之熔斷器Hystrix的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 對(duì)ThreadLocal內(nèi)存泄漏及弱引用的理解

    對(duì)ThreadLocal內(nèi)存泄漏及弱引用的理解

    這篇文章主要介紹了對(duì)ThreadLocal內(nèi)存泄漏及弱引用的理解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 詳解springmvc之json數(shù)據(jù)交互controller方法返回值為簡(jiǎn)單類型

    詳解springmvc之json數(shù)據(jù)交互controller方法返回值為簡(jiǎn)單類型

    這篇文章主要介紹了springmvc之json數(shù)據(jù)交互controller方法返回值為簡(jiǎn)單類型,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-05-05
  • 使用Java完成Socket文件傳輸方式

    使用Java完成Socket文件傳輸方式

    這篇文章主要介紹了使用Java完成Socket文件傳輸方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • SpringBoot中使用websocket出現(xiàn)404的解決方法

    SpringBoot中使用websocket出現(xiàn)404的解決方法

    在Springboot中使用websocket時(shí),本地開發(fā)環(huán)境可以正常運(yùn)行,但部署到服務(wù)器環(huán)境出現(xiàn)404問題,所以本文小編講給大家詳細(xì)介紹一下SpringBoot中使用websocket出現(xiàn)404的解決方法,需要的朋友可以參考下
    2023-09-09

最新評(píng)論