Mybatis事务失效的几种情况

Mybatis事务

默认配置下,事务只会对Error和RuntimeException及其子类这些UNChecked异常,做出回滚。一般的Exception异常不会回滚,如果一般Exception想要回滚则需要手动抛出Runtimeexception进行回滚。或者把@Transactional改为@Transactional(rollbackFor = Exception.class)

事务未生效

1、spring的事务注解@Transactional只能放在public修饰的方法上才起作用,如果放在其他非public(private,protected)方法上,虽然不报错,但是事务不起作用

2、在方法内用try…catch 捕获了异常,但没有抛出能够RuntimeException异常。如果需要抛出exception异常,事务也进行回滚,则需要把注解@Transactional改为@Transactional(rollbackFor = Exception.class)

3、如果采用spring+spring mvc,则context:component-scan重复扫描问题可能会引起事务失败。 如果spring和mvc的配置文件中都扫描了service层,那么事务就会失效。原因如下:

  • a Spring与SpringMVC属于父子容器关系。框架启动时先启动Spring容器,而后启动SpringMVC容器。子容器可以访问父容器中的Bean,而父容器不能访问子容器中的Bean。
  • b 由于SpringMVC在扫描时扩大了扫描范围,装载了@Service标识的类的实例,从而导致Controller层在注入Service时,实际注入的时子容器中的Service实例。
  • c 事务被配置在父容器中,Spring父容器在装载Service时会同时应用事务配置,而SpringMVC只是单纯加载Service的实例。

4、如使用mysql且引擎是MyISAM,则事务会不起作用,原因是MyISAM不支持事务,可以改成InnoDB引擎

5、在类A里面有方法a 和方法b, 然后方法b上面用 @Transactional加了方法级别的事务,在方法a里面 调用了方法b, 方法b里面的事务不会生效。原因是在同一个类之中,方法互相调用,切面无效 ,而不仅仅是事务。这里事务之所以无效,是因为spring的事务是通过aop实现的。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值