如何解決Spring事務(wù)注解@Transactional在類內(nèi)部方法調(diào)用不生效
Spring事務(wù)注解@Transactional在類內(nèi)部方法調(diào)用不生效
問題現(xiàn)象
package cn.sw.study.web.service.impl; import cn.sw.study.web.dao.UserMapper; import cn.sw.study.web.model.User; import cn.sw.study.web.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Date; /** * 用戶業(yè)務(wù)類 */ @Service public class UserServiceImpl implements UserService{ @Autowired UserMapper userMapper; public void addInfo() { addOne(); } @Transactional public void addOne() { User record = new User(); record.setLoginName("tom"); record.setPwd("111111"); record.setMobile("13913913913"); record.setUsable(1); record.setCreateTime(new Date()); userMapper.insertSelective(record); int i = 1/0; // 測試事務(wù)的回滾 } }
如果從外部類直接調(diào)用addOne方法,則事務(wù)是可以正常生效的。
此時(shí)addInfo方法上沒有事務(wù)注解,addOne方法上有事務(wù)注解,運(yùn)行addInfo調(diào)用addOne方法,不會(huì)產(chǎn)生事務(wù),測試數(shù)據(jù)遇到異常沒有回滾。
問題原因
在默認(rèn)情況下,大部分使用spring的事務(wù)都是使用代理的模式,代理實(shí)現(xiàn)的事務(wù)有一定的局限性:
僅有在公有方法上標(biāo)記的@Transactional有效;
僅有外部方法調(diào)用過程才會(huì)被代理截獲,事務(wù)才會(huì)有效,也就是說,一個(gè)方法調(diào)用本對(duì)象的另一個(gè)方法,沒有通過代理類,事務(wù)也就無法生效。
解決辦法
手動(dòng)獲取代理類之后再調(diào)用
((UserServiceImpl)AopContext.currentProxy()).addOne();
問題解決!
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java使用CompletableFuture進(jìn)行非阻塞IO詳解
這篇文章主要介紹了Java使用CompletableFuture進(jìn)行非阻塞IO詳解,CompletableFuture是Java中的一個(gè)類,用于支持異步編程和處理異步任務(wù)的結(jié)果,它提供了一種方便的方式來處理異步操作,并允許我們以非阻塞的方式執(zhí)行任務(wù),需要的朋友可以參考下2023-09-09spring動(dòng)態(tài)注冊(cè)bean?AOP失效原理解析
這篇文章主要為大家介紹了spring動(dòng)態(tài)注冊(cè)bean使AOP失效原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07Java藍(lán)橋杯實(shí)現(xiàn)線段和點(diǎn)
本文主要介紹Java藍(lán)橋杯實(shí)現(xiàn)線段和點(diǎn)的內(nèi)容,感興趣的小伙伴可以參考下文2021-08-08Spring Boot Shiro在Web應(yīng)用中的作用詳解
這篇文章主要為大家介紹了Spring Boot Shiro在Web應(yīng)用中的作用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02Java并發(fā)編程之ConcurrentLinkedQueue解讀
這篇文章主要介紹了Java并發(fā)編程之ConcurrentLinkedQueue解讀,非阻塞的實(shí)現(xiàn)方式則可以使用循環(huán)CAS的方式來實(shí)現(xiàn),而ConcurrentLinkedQueue就是juc包中自帶的經(jīng)典非堵塞方式實(shí)現(xiàn)的工具類,需要的朋友可以參考下2023-12-12Linux中Java開發(fā)常用軟件安裝方法總結(jié)
這篇文章主要介紹了Linux中Java開發(fā)常用軟件安裝方法總結(jié),需要的朋友可以參考下2020-02-02