如何解決Spring事務(wù)注解@Transactional在類(lèi)內(nèi)部方法調(diào)用不生效
Spring事務(wù)注解@Transactional在類(lèi)內(nèi)部方法調(diào)用不生效
問(wèn)題現(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ù)類(lèi) */ @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; // 測(cè)試事務(wù)的回滾 } }
如果從外部類(lèi)直接調(diào)用addOne方法,則事務(wù)是可以正常生效的。
此時(shí)addInfo方法上沒(méi)有事務(wù)注解,addOne方法上有事務(wù)注解,運(yùn)行addInfo調(diào)用addOne方法,不會(huì)產(chǎn)生事務(wù),測(cè)試數(shù)據(jù)遇到異常沒(méi)有回滾。
問(wèn)題原因
在默認(rèn)情況下,大部分使用spring的事務(wù)都是使用代理的模式,代理實(shí)現(xiàn)的事務(wù)有一定的局限性:
僅有在公有方法上標(biāo)記的@Transactional有效;
僅有外部方法調(diào)用過(guò)程才會(huì)被代理截獲,事務(wù)才會(huì)有效,也就是說(shuō),一個(gè)方法調(diào)用本對(duì)象的另一個(gè)方法,沒(méi)有通過(guò)代理類(lèi),事務(wù)也就無(wú)法生效。
解決辦法
手動(dòng)獲取代理類(lèi)之后再調(diào)用
((UserServiceImpl)AopContext.currentProxy()).addOne();
問(wèn)題解決!
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Servlet Filter過(guò)濾器執(zhí)行順序
這篇文章主要介紹了Servlet Filter過(guò)濾器執(zhí)行順序的相關(guān)資料,幫助大家更好的理解為什么要用過(guò)濾器,感興趣的朋友可以了解下2020-12-12Java使用CompletableFuture進(jìn)行非阻塞IO詳解
這篇文章主要介紹了Java使用CompletableFuture進(jìn)行非阻塞IO詳解,CompletableFuture是Java中的一個(gè)類(lèi),用于支持異步編程和處理異步任務(wù)的結(jié)果,它提供了一種方便的方式來(lái)處理異步操作,并允許我們以非阻塞的方式執(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-08Java開(kāi)發(fā)常用類(lèi)庫(kù)之Hutool詳解
這篇文章主要介紹了Java開(kāi)發(fā)常用類(lèi)庫(kù)之Hutool,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02Spring 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的方式來(lái)實(shí)現(xiàn),而ConcurrentLinkedQueue就是juc包中自帶的經(jīng)典非堵塞方式實(shí)現(xiàn)的工具類(lèi),需要的朋友可以參考下2023-12-12Linux中Java開(kāi)發(fā)常用軟件安裝方法總結(jié)
這篇文章主要介紹了Linux中Java開(kāi)發(fā)常用軟件安裝方法總結(jié),需要的朋友可以參考下2020-02-02