解决@Transactional事务在类内部方法调用不生效
首先描述下类内部方法互相调用,事务不生效的情况UserService测试接口类package cn.sw.study.web.service;/** * Created by shaowei on 2017/4/26. */public interface UserService { void addInfo(); void addOne();}
UserServiceImpl测试实现类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;/** * 用户业务类 * Created by shaowei on 2017/4/26. */@Service("userService")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; // 测试事物的回滚 }}
addInfo方法上没有事务注解,addOne方法上有事务注解,此时运行addInfo调用addOne方法,不会产生事务,测试数据遇到异常没有回滚。如果从外部类直接调用addOne方法,则事务是可以正常生效的。
如果想类内部方法调用可以正常使用事务,使用AopContext.currentProxy()来获取代理类再调用
再次运行,如果没有添加expose-proxy="true"这个属性,则会报错java.lang.IllegalStateException: Cannot find current proxy: Set 'exposeProxy' property on Advised to 'true' to make it available.
在spring配置文件中添加,<aop:aspectj-autoproxy expose-proxy="true"/>,再次运行,则发现事务已经生效,到异常的地方事务正常回滚了
- 7
从日志中也可以看到Creating new transaction和Rolling back JDBC transaction
END
注意事项
- 使用 AspectJ 取代 Spring AOP 代理方式也可以解决上面非public和类内部方法调用事务不生效的问题,这里就不做详细说明
阅读更多
- 关于加@Transactional注解的方法之间调用,事务是否生效的问题
- spring事务 方法调用内部方法 事务不生效
- Spring service本类中方法调用另一个方法事务不生效问题
- SpringBoot CGLIB AOP解决Spring事务,对象调用自己方法事务失效.
- [拦截器]关于拦截方法调用其他内部方法无法被拦截问题的解决
- Spring service本类中方法调用另一个方法事务不生效问题
- Spring service本类中方法调用另一个方法事务不生效问题
- jQuery中checkbox反复调用attr('checked', true/false)只有第一次生效的解决方法
- 关于使用Spring声明式事务时,在类的内部方法互相调用时,Spring无法拦截内部方法调用,导致事务不起作用的问题研究
- Spring事务拦截不到内部方法的互相调用
- spring本类中调用事务方法不生效
- [拦截器]关于拦截方法调用其他内部方法无法被拦截问题的解决
- Spring service本类中方法调用另一个方法事务不生效问题
- spring方法内部调用方法事务关系
- Spring service本类中方法调用另一个方法事务不生效问题
- Shtml完美解决静态页面内部调用其他页面(非Iframe、Object、Js方法)
- jQuery中checkbox反复调用attr('checked', true/false)只有第一次生效的解决方法
- 关于拦截方法调用其他内部方法无法被拦截问题的解决
- spring事务,内部调用生效
- jQuery中checkbox反复调用attr('checked', true/false)只有第一次生效的解决方法