Spring事务

一、声明事务[@Transactional]


简介:通过AOP来控制事务,有异常抛出事务就会回滚(数据变更),使用的时候要谨慎,因为他有12种失

效场景。
-->默认是遇到运行时异常才会回滚[runtimeException],加上frllbackFor=Exception.clss的时候就可以在非运行异常回滚

1、使用方法

注解可以作用在接口、类、类方法
类:  该类的所有public方法都配置了相同的事务
方法:方法的事务会覆盖类事务
接口:不建议这么使用,因为配置了Spring的AOP使用CGLIB就是导致注解失效
-->额外提一句:CGLIB是一个高性能的代码生成类库,为没有实现接口的类提供代理。
-->实现类内部调用不走动态代理,所以被引用的方法注解不生效

2、注解的属性


propagation:事物的传播行为:
默认为Propagation.REQUIED->如果当前存在事务就加入事务,如果没有就新建一个事务
Propagation.SUPPORTS->如果当前存在事务就加入事务,如果当前不存在事务就以非事务的方式运行
Propagation.MANDATORY->如果当前存在事务就加入事务,如果当前不存在事务就抛出异常
Propagation.REQUIRES_NEW:重新创建一个新事务,如果当前存事务暂停当前事务
Propagation.NOT_SUPPORTED->以非事务的方式运行,如果当前存在事务暂停当前事务
Propagation.NEVER->以非事务的方式运行,如果当前存在事务就抛出异常
Propagation.NESTED->和默认效果一样


isolation属性:
事务的隔离级别。默认Isolation.DEFAULT,不做隔离,使用数据库的默认隔离级别


READ_UNCOMMITTED->读未提交
-->读事务允许其他读事务和写事务,为提交的写事务禁止其他写事务,该事务可以防止更新丢失,不能防止脏读、不可重复读、欢度,通过排他写锁实现


READ_COMMITTED->读已提交
-->读事务允许其他读事务和写事务,未提交的写事务禁止其他读事务和写事务,此级别可以防止更新丢失、脏读、不能防止不可重复读、幻读,通过瞬间共享读锁和排他写锁实现
REPEATABLE_READ->可重复读,是mysql的默认事务隔离级别
-->读事务近期之塔写事务,允许读事务,为提交的写事务禁止其他读事务和写事务,可以防止更新丢失、脏读、不可重复读,不能防止幻读,可以通过共享读锁和排他写锁实现


SERIALIZABLE->序列化
-->最严格是事务隔离,事务只能一个一个的执行,不能并发。

timeout属性:默认值为-1,如果超过时间限制事务没有完成,自动回滚

readOnly属性:事务是否为只读事务,默认为false,忽略不需要都市无的方法(比如读取数据,就可以设置为true)

rollbackFor属性:明确处罚事务回滚的异常类型,可以指定多个异常

noRollbackFor属性:抛出指定异常不会滚事务,也可以指定多个异常类型

3、失效场景

spring对注解的解析是基于代理,如果方法无法被spring代理,那就无法被spring管理事务
spring生成代理的方式有两种:(1)基于接口的jdk动态代理,要求模板代理类需要实现一个接口才能被

代理;(2)基于实现模板类子类的CGLIB代理

Spring在2.0之前,目标类如果实现了接口,则使用JDK动态代理方式,否则通过CGLIB子类的方式生成代

理。
而在2.0版本之后,如果不在配置文件中显示的指定spring.aop.proxy-tartget-class的值,默认情况下

生成代理的方式为CGLIB,如下图

失效场景集一:代理不生效
(1)将注解标注在接口方法上
-->代理方式是CGLIB时,无法解析到@Transactional
(2)被final、static关键字修士的类活方法
-->CGLIB是通过生成模板类子类的方法生成代理类,被final、static修士无法继承父类于父类的方法
(3)类方法内部调用
-->事务的管理是通过代理执行的方式生效的,方法内部调用将不走代理逻辑,也就调用不到
(4)类没有被spring管理
-->没有被spring管理的案例

失效场景集二:框架或底层不支持的功能
(5)非public修饰的方法
(6)多线程调用
(7)数据库本身不支持事务
(8)未开启事务

失效场景集三:错误使用@Transactional
(9)错误的传播机制
(10)rollbackFor属性设置错误
(11)异常被内部catch
(12)嵌套事务

二、编程事务

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值