开发者

如何解决Spring事务注解@Transactional在类内部方法调用不生效

目录
  • Spring事务注解@Transactional在类内部方法调用不生效
    • 问题现象
    • 问题原因
  • 解决办法
    • javascript

      Spring事务注解@Transactional在类内部方法调用不生效

      问题现象

      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.springframeworandroidk.transaction.annotation.Transactional;
      import Java.util.Date;
      
      /**
       * 用户业务类
       */
      @Service
      public class UserServiceImpl implements UserService{
      
          @Autowired
          Usewww.devze.comrMapper 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;    // 测试事务的回滚
          }
      }

      如果从外部类直接调用addOne方法,则事务是可以正常生效的。

      此时addInfo方法上没有事务注解,addOne方法上有事务注解,运行addInfo调用addOne方法,不会产生事务,测试数据遇到异常没有回滚。

      问题原因

      在默认情况下,大部分使用spring的事务都是使用代理的模式,代php理实现的事务有一定的局限性:

      仅有在公有方法上标记的@Transactional有效;

      仅有外部方法调用过程才会被代理截获,事务才会有效,也就是说,一个方法调用本对象的另一个方法,没有通过代理类www.devze.com,事务也就无法生效。

      解决办法

      手动获取代理类之后再调用

      ((UserServiceImpl)AopContext.currentProxy()).addOne();

      问题解决!

      总结

      以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

      0

      上一篇:

      下一篇:

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      最新开发

      开发排行榜