龙空技术网

Spring中事务失效的几种情况

Mr丶先生 194

前言:

此时小伙伴们对“mysql事务失效”大体比较注重,姐妹们都想要分析一些“mysql事务失效”的相关文章。那么小编在网摘上网罗了一些关于“mysql事务失效””的相关文章,希望咱们能喜欢,姐妹们一起来了解一下吧!

数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位

spring如何开启事务

正确代码实例:

@Servicepublic class ServiceImpl implements Service {    @Transactional(rollbackFor = Exception.class)    public void update(string xxxx) {        // update  logic    }}
以下几种情况会导致开启的事务失效1.数据库引擎不支持事务

mysql存储引擎除了innodb,其它都不支持事务

2.类没有被spring管理

比如上面的代码示例中的ServiceImpl类没有增加 @Service注解,这个类就不会被加载成一个bean,不会被spring管理,事务也就失效了

3.方法非public修饰

@Transactional只能用在public方法上面,原因是spring要求被代理的方法必须是public,否则事务不会生效。

4.方法中调用同类方法

@Servicepublic class ServiceImpl implements Service {    public void test(string xxxx) {        update(xxxx);    }        @Transactional(propagation =  Propagation.REQUIRED)    public void update(string xxxx) {            // update logic    }}

因为是AOP,直接调用内部方法并非是代理类调用

5.抛出的异常被捕获

@Servicepublic class ServiceImpl implements Service {    @Transactional    public void update(string xxxx) {        try {            // update logic        } catch {        }    }}

异常被内部try catch 捕获,外部事务不会捕获异常,触发回滚

6.事务的传播机制配置错误

@Servicepublic class ServiceImpl implements Service {    @Transactional(propagation =  Propagation.NEVER)    public void update(string xxxx) {        try {            // update logic        } catch {        }    }}

spring事务传播机制说明可参考下述文章

Spring事务传播机制

7.rollbackFor属性设置错误

@Servicepublic class ServiceImpl implements Service {    @Transactional(rollbackFor = NullPointerException.class)    public void update(string xxxx) {            // update logic    }}

rollbackFor 用于指定能够触发事务回滚的异常类型,可以指定多个异常类型。 默认是在RuntimeExceptionError上回滚。 若异常非配置指定的异常类,则事务失效

8.noRollbackFor属性设置错误

和rollbackFor互补使用,用法相反

9.被final修饰的方法

@Servicepublic class ServiceImpl implements Service {    @Transactional(rollbackFor = Exception.class)    public final void update(string xxxx) {        // update logic    }}

final修饰的方法表明方法不能被子类重写 spring事务的底层是通过aop来创建一个代理类,而代理类无法重写该方法,无法实现事务功能。

标签: #mysql事务失效