精华内容
下载资源
问答
  • @Transactional注解只能应用到public可见度的方法上,如果应用在protected、private或者package可见度的方法上,也不会报错,不过事务设置不会起作用。 2、检查你的异常类型是不是unchecked异常。默认情况下,Spring...

    1、检查你的方法是不是public的。@Transactional注解只能应用到public可见度的方法上,如果应用在protected、private或者package可见度的方法上,也不会报错,不过事务设置不会起作用。

    2、检查你的异常类型是不是unchecked异常。默认情况下,Spring会对unchecked异常进行事务回滚,如果是checked异常则不回滚。如空指针异常、算术异常等,会被回滚;文件读写、网络出问题,spring就没法回滚了。如果你想check异常也回滚怎么办,注解上面写明异常类型即可:

    @Transactional(rollbackFor = Exception.class)
    

    类型的还有norollbackFor,自定义不回滚的异常。

    3、是否在service中进行了try…catch的操作,由于已经被捕获异常,故事务也不会回滚。如果非要在service中try…catch异常,又想要事务回滚,可在catch块中抛出运行时异常:

    try{
        ....  
    }catch(Exception e){
        logger.error("",e);
        throw new RuntimeException;
    }
    

    这种方法有个不足之处,就是不能在catch块中存在return子句,若想捕获异常时回滚事务,同时返回提示信息,可以使用手动回滚:

    try{
        ...
    }catch(Exception e){
        logger.error("",e);
        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        return ERROR_MESSAGE;
    }
    

    复制代码
    PS:另外说明一下,在controller层捕获了service层的异常,事务还会回滚吗?答案是会的,只要你service层抛出了异常,并且你加的事务可以处理这个异常,也就是rollbackFor = Exception.class这个符合你抛出的异常,不管外面有没有捕获都可以回滚。

    4、是否开启了对注解的解析:

    <bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
              id="transactionManager">
            <property name="dataSource" ref="dataSource"/>
    </bean>
    <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
    

    5、数据库引擎要支持事务,如果是mysql,注意表要使用支持事务的引擎,比如innodb,如果是myisam,事务是不起作用的。

    6、spring是否扫描到你这个包,如下是扫描到org.test下面的包:

    <context:component-scan base-package="org.test" ></context:component-scan>
    

    7、检查是不是同一个类中的方法调用(如A方法无@Transactional注解,调用了一个有@Transactional注解的方法),这样事务也是不生效的。

    展开全文
  • 不生效场景一:try-catch捕获了 @Transactional public void transactionalNotEffect01() { try { Person p1 = new Person(); p1.setName(LocalDateTime.now().toString()); personDao.insertSelective(p1); ...

    源码下载

    https://github.com/cbeann/Demooo/tree/master/springboot-transactional-demo

    不生效场景1:try-catch捕获了

    不生效原因:内部逻辑把异常捕获,所以不生效

    @Transactional
     public void transactionalNotEffect01() {
        try {
          Person p1 = new Person();
          p1.setName(LocalDateTime.now().toString());
          personDao.insertSelective(p1);
          int i = 1 / 0;
        } catch (Exception e) {
          e.printStackTrace();
          System.out.println("my error");
        }
      }

    不生效场景2:方法不使用public修饰

    不生效原因:他会判断是不是public

    @Service
    public class StudentService {
    
      @Autowired private PersonDao personDao;
    
    
      // 不生效2
      @Transactional
      protected void transactionalNotEffect02() {
        Person p1 = new Person();
        p1.setName(LocalDateTime.now().toString());
        personDao.insertSelective(p1);
        int i = 1 / 0;
      }
      
    }
    
    @RestController
    public class TransactionalNotEffect02Controller {
    
      @Autowired private StudentService studentService;
    
      @GetMapping("/transactionalNotEffect02")
      public Object getAll(){
          studentService.transactionalNotEffect02();
        return 1;
      }
    }

     不生效场景3:通过this调用,没有走代理方法

     // 不生效3
      public void transactionalNotEffect03() {
        this.addPerson();
      }
    
      @Transactional
      public void addPerson() {
        Person p1 = new Person();
        p1.setName(LocalDateTime.now().toString());
        personDao.insertSelective(p1);
        int i = 1 / 0;
      }
    @RestController
    public class StudentController {
    
      @Autowired private StudentService studentService;
    
      @GetMapping("/transactionalNotEffect03")
      public Object transactionalNotEffect03() throws Exception {
        studentService.transactionalNotEffect03();
        return 1;
      }
    }
    

    不生效场景4:@Transactional 注解属性 propagation 设置错误

    参考:https://blog.csdn.net/sayoko06/article/details/79164858

    @Service
    public class StudentService {
    
      @Autowired private PersonDao personDao;
    
      // 不生效4
      @Transactional(propagation= Propagation.NOT_SUPPORTED)
      public void transactionalNotEffect04() {
        Person p1 = new Person();
        p1.setName(LocalDateTime.now().toString());
        personDao.insertSelective(p1);
        int i = 1 / 0;
      }
    }
    @GetMapping("/transactionalNotEffect04")
      public Object transactionalNotEffect04() throws Exception {
        studentService.transactionalNotEffect04();
        return 1;
      }

    不生效场景5:@Transactional的rollbackFor 属性设置为自定义异常,最后跑去其它异常

    没有测试出来(因此此处不贴代码)

    不生效场景6:数据库引擎不支持事务

    参考

    https://blog.csdn.net/sayoko06/article/details/79164858

    https://blog.csdn.net/qq_20597727/article/details/84900994

    展开全文
  • 在最近写的一个Springboot + shiro项目中,想在userService层加入事务,结果发现死活不生效 更奇怪的是,我在其他Service层加事务,100%有效! 在网上找了很多,都是些很基本的原因,后面再说怎么解决的,先把这些基本问题贴...

    问题起因

    在最近写的一个Springboot + shiro项目中,想在userService层加入事务,结果发现死活不生效
    更奇怪的是,我在其他Service层加事务,100%有效!
    在网上找了很多,都是些很基本的原因,后面再说怎么解决的,先把这些基本问题贴出来

    基本原因

    1. @Transactional 注解只能应用到 public 可见度的方法上。 如果应用在protected、private或者 package可见度的方法上,也不会报错,不过事务设置不会起作用。
    2. 默认情况下,spring会对unchecked异常进行事务回滚;如果是checked异常则不回滚。针对这种情况,可以try catch checked异常后进行手动事务回滚。
    3. 数据库引擎要支持事务,如果是mysql,注意表要使用支持事务的引擎,比如InnoDB,如果是MyISAM,事务是不起作用的。
    4. 同一个类中, 一个no-transactional的方法去调用transactional的方法, 事务会失效。

    深层原因

    罪魁祸首是ShiroFilterFactoryBean
    由于使用了shiro 的原因,ShiroFilterFactoryBean实现了FactoryBean,会使其优先于 使注解生效的处理器
    AnnotationAwareAspectJAutoProxyCreator 加载,
    默认情况下,Spring会先加载Bean的依赖,及
    ShiroFilterFactoryBean 依赖于 SecurityManager 依赖于 UserRealm 依赖于 UserService
    所以加载顺序为
    UserService>UserRealm>SecurityManager>ShiroFilterFactoryBean 这些Bean加载完
    到后面,Spring才开始处理Bean的AOP相关逻辑,但是发现这几个Bean已经被优先处理,所以会提示
    XXX is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
    没有资格被AnnotationAwareAspectJAutoProxyCreator的BeanPostProcessor进行处理
    AnnotationAwareAspectJAutoProxyCreator参考:https://www.cnblogs.com/liuyk-code/p/9886033.html

    如何解决

    在UserRealm里面的UserService上面加入注解@Lazy,使其加载顺序不跟ShiroFilterFactoryBean走,
    使AnnotationAwareAspectJAutoProxyCreator正常代理这个Bean

    展开全文
  • 2.在主方法(无@Transactional注解的方法)调用@Transactional事务注解子方法时,子方法的事务失效,注:事务可传递,在主方法上加@Transactional即可,如果子方法在其他地方也有调用,都加上也可以 3.@...

    1.没有配置事务管理器。

    2.在主方法(无@Transactional注解的方法)调用@Transactional事务注解子方法时,子方法的事务失效,注:事务可传递,在主方法上加@Transactional即可,如果子方法在其他地方也有调用,都加上也可以

    3.@Transactional注解只能应用到 public 修饰的方法

    4.数据库引擎不支持事务导致事务不生效

    5.对check类型不生效,check类型异常这样注释@Transactional(rollbackOn = Exception.class)。

      换句话就是只对uncheck类型生效,运行异常。非RuntimeException不生效

    展开全文
  • 最近换了一份工作,公司用的SSM,在开发过程中发现了使用事务注解@Transactional无效,问了其他同事,貌似其他项目也是同样的问题…只好自己百度解决 网上有几种失效的原因,这里大致说一下 1. 配置文件未开启事务...
  • 最近这几天玩分布式事务的,使用 atomikos ,配置好 atomikos 后再Service层添加事务注解,可是一直有个问题,注解不生效。刚开始以为表支持事务,可看了一下表类型是InnoDB ,是支持事务的。 后来我尝试通过...
  • springboot中使用@Transactional注解事物不生效的原因

    万次阅读 多人点赞 2019-04-24 11:19:14
    一:在springboot中使用...另一种是声明式事物,分为两种情况01:一种是通过传统xml方式配置,02:使用@Transaction注解方式配置,这是主要讲解的是通过注解方式配置。因为在springboot项目中,会自动配置DataSour...
  • Spring @Transactional注解不生效在spring mvc + mysql的项目中,使用Transactional的时候回滚。在方法上加的是@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) 首先先检查了...
  • @Transactional注解不起作用解决办法及原理分析

    万次阅读 多人点赞 2018-12-09 00:21:50
    Transactional注解标注方法修饰符为非public时,@Transactional注解将会起作用。例如以下代码。 定义一个错误的@Transactional标注实现,修饰一个默认访问符的方法 /** * @author zhoujy * @date 2018年12月06日...
  • 1、在同一个类中,没有@Transactional注解的方法去调用有@Transactional注解 2、@Transactional注解修饰的方法不是public的 3、抛出的异常为checked类型 但今天比较倒霉了,@Transactional失效,都不是以上3个...
  • SpringBoot @Transactional 注解生效

    千次阅读 2019-11-27 22:18:35
    @Transactional 注解生效的原因1. 数据库引擎支持事务2. @Transactional 修饰非 public 方法3. @Transactional 修饰的方法未通过接口调用4. @Transactional 修饰的方法内部捕获异常 1. Spring 中使用事务管理的...
  • 新手疑问之为什么我已经加上了@Transactional注解,还是失效呢??? 这个很好回答,要么没有生成代理类调用,要么没有开启事务。可以参考细说@Transactional用法及原理 老鸟致命疑问之为什么我已经加上了@...
  • 近期项目中遇到很多需要事务处理的逻辑,所以对@Transactional注解的作用条件测试了一番。 @Transactional注解是spring定义的一个注解,可以被子类继承,可以声明在类型、方法上,声明在类型时,可以看作给该类型下...
  • 主要介绍了Spring @Transactional注解失效解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 引言@Transactional注解相信大家并陌生,平时开发中很常用的一个注解,它能保证方法内多个数据库操作要么同时成功、要么同时失败。使用@Transactional注解时需要注意许多的细节,不然你会发现@Transactional总是...
  • 一、在springBoot使用事物时,发现事务并没有正常执行,没有... @Transactional public String addIncome1(@RequestParam("name") String name, @RequestParam("amount") double amount) { ...
  • 1.spring-mvc.xml中是否扫描该路径&...2.注解功能是否启动&lt;tx:annotation-driven transaction-manager="txManager" /&gt;3.配置声明式事务管理&lt;bean id="txM...
  • @Transactional注解的失效场景

    千次阅读 2020-04-16 10:17:01
    wfr=spider&for=pc学习留存转载。有问题请联系本人删除 ------------------------------------------------- 一、事务 ...事务管理在系统开发中是可缺少的一部分,Spring提供了很好事务管理机制...
  • 注解事务不生效的原因可能是因为代码中使用了try catch代码块进行了处理,因为事务使用的是动态代理,代理类接收到异常,所以就不会调用回滚方法。 解决方法:直接向上抛异常或者在catch里再把异常抛出去。 ...
  • 在常规使用@transactional注解时,如果碰到不生效问题,要首先想到如下几个问题:  1. 如果是有关数据库操作,首先要查看牵涉到的表使用的引擎是什么引擎,要知道使用"MYISAM"数据库引擎是支持事务回滚操作的,需要...
  • @Transactional能标记私有方法不生效 transactional标签用于将对应包装的bean设置成一个新的代理bean对象供外部使用,就是说外部调用这个proxy bean的公共方法时先会调用开启事务等的切面工作,若设置成私有方法只能...
  • 相当于身份验证的东西,如果没有签到,就能调用其他接口。项目原来的同事是先写一个验签方法,在需要验证签到的方法里面调用。这样一来就很麻烦,如果接口很多的话写起来真费劲。于是我就改成用AOP的方式处理。 ...
  • 主要介绍了Java注解@Transactional事务类内调用不生效问题及解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 点击上方Java后端,选择设为星标优质文章,及时送达引言昨天公众号粉丝咨询了一个问题,说自己之前面试被问@Transactional注解哪些场景下会失效,一时语塞致使面试失败。所以今天简单的和大家分享一下@Transactional...
  • > 这几天在项目里面发现我...先来了解一下@Transactional注解的特性吧,可以更好排查问题 service类标签(一般建议在接口上)上添加@Transactional,可以将整个类纳入spring事务管理,在每个业务方法执行时都会

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,458
精华内容 3,383
关键字:

transactional注解不生效