Spring之事务

一、简介

        事务是逻辑上的一组操作,要么都执行,要么都不执行。

二、事务的特性(ACID)

  • 原子性(Atomicity): 一个事务(transaction)中的所有操作,或者全部完成,或者全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。即,事务不可分割、不可约简。

  • 一致性(Consistency): 在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设约束、触发器、级联回滚等。

  • 隔离性(Isolation): 数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括未提交读(Read uncommitted)、提交读(read committed)、可重复读(repeatable read)和串行化(Serializable)。

  • 持久性(Durability): 事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

三、Spring中的事务

3.1添加事务

        在Spring Boot的启动类上加一个@EnableTransactionManagement注解。在执行的方法上加一个@Transitional注解,这个时候这个方法就支持事务了。

3.2相关参数

  • timeout:默认30秒

  • isolation:设置事务隔离级别(mysql的那一套)

  • readOnly :true表示只读,false表示可读可写,默认值为false

  • rollbackFor:该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。

四、事务失效的场景

4.1访问修饰符非public

解决方案:a.将方法修饰符改为public

                    b.开启AspectJ代理模式

注意:如果事务是static、final的,也是无法通过动态代理,事务不会生效的。(原因:Spring的声明式事务是基于动态代理实现的,我们无法重写final修饰的方法;不管是JDK动态代理还是Cglib的动态代理,就是要通过代理的方式获取到代理的具体对象,而static方法修饰的方法是属于类的,不属于任何对象,所以static方法不能被重写,即便写法上是重写,但是并不具备重写的含义,也就是说static方法也不被进行动态代理。

4.2数据表本身不支持事务

解决方案:将数据表改为InnoDB存储引擎,支持事务

4.3catch掉异常之后,没有再次抛出异常

解决方案:catch块中添加throw new RuntimeException异常(手动抛出运行时异常)或者Spring支持的异常类型

4.4aop切面顺序

原因:事务切面优先级最低,如果自定义的切面优先级和事务一样,则还是自定义切面内层,若自定义切面没有正确抛出异常,则不会回滚

解决方案:手动设置TransactionStatus.setRollbackOnly()

4.5调用本类方法导致事务失效

原因:本类方法调用不经过代理,因此无法增强

解决办法:a.依赖注入自己(代理)来调节

                    b.通过AopContext拿到代理对象,来调用

                    c.用过CTW、LTW实现功能增强

4.6@Transactional没有保证原子行为

原因:事务的原子性仅包含insert、update、delete、select...for update语句,select方法不阻塞

4.7父子容器导致的事务失效

原因:子容器扫描范围过大,把未加事务配置的service扫描过来

解决办法:a.各自扫描

                    b.不使用父子容器,所有bean放在同一容器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值