spring事务

开启、执行、关闭事务,用 AOP 实现事务管理
特性:原子、一致、隔离、持久
隔离级别:
ISOLATION_DEFAULT,数据库默认级别:-1
ISOLATION_READ_UNCOMMITTED,未提交读:1
ISOLATION_READ_COMMITTED,读写提交:2 不能读取未提交的内容;但不可重复读(一个更新,一个回滚没问题;同时更新会有问题);Oracle 默认级别
ISOLATION_REPEATABLE_READ,可重复读:4 有未提交的事务,会阻塞它的读取;幻读,针对多条记录而言;Mysql 默认级别
ISOLATION_SERIALIZABLE,串行化:8 最高级别,通过锁机制实现
数据安全与性能博弈:乐观锁、Redis 等
传播行为:解决的问题,批量任务时,一部分成功的提交,一部分异常的回滚;
enum Propagation. 7 个,常用的 3 个
/**
*需要事务,它是默认传播行为,如果当前存在事务,就沿用当前事务,
*去否则新建一个事务运行子方法

REQUIRED(TransactionDefinition.PROPAGATION_REQUIRED),
*
*无论当前事务是否存在,都会创建新事务运行方法,
*这样新事务就可以拥有新的锁和隔离级别等特性,与当前事务相互独立

REQUIRED_NEW(TransactionDefinition.PROPAGATION_REQUIRED_NEW),
*
*在当前方法调用子方法时,如果子方法发生异常,,
*只因滚子方法执行过的 SQL,而不回滚当前方法的事务
*/
NESTED(TransactionDefinition.PROPAGATION_NESTED),
@Transactional 自调用失效问题
Spring 数据库事务的约定,其实现原理是 AOP,而 AOP 的原理是动态代理,
在自调用的过程中,是类自身的调用,而不是代理对象去调用,那么就不会产生 AOP,
service 类是否配置了相关的 aop 拦截配置
如果目标类是接口就一定会使用 jdk 代理,如果目标类没有可以代理的接口就一定会使用 Cglib 代理
从 IoC 容器取出的对象是一个代理对象,通过它能够克服自调用的问题。

Spring 事务传播?

传播特性有几种?七种
Required,Requireds_new,nested,Support,Not_Support,Never,Mandatory
某一个事务嵌套另外一个事务的时候怎么办?
A 方法调用 B 方法,AB 方法都有事务,并且传播特性不同,那么 A 如果有异常,B 怎么办,B 如果有异常,A 怎么办?


:事务的传播特性指的是不同方法的嵌套调用过程中,事务该如何进行处理,是同一个事务还是不同的事务,当出现异常的时候会回滚还是提交,两个方法之间相互影响,在日常工作中,使用比较多的是 required,Requireds_new
:1.先说事务的不同分类,可以分为三类,支持当前事务,不支持当前事务,嵌套事务
​ 2.如果外层方法是 required,内层方法是:required,requireds_new,nested
​ 3.如果外层方法是 requireds_new,内层方法是:required,requireds_new,nested
​ 4.如果外层方法是 nested,内层方法是:required,requireds_new,nested
核心处理逻辑非常简单:
1.判断内外方法是否是同一事务:
​ 是:异常统一在外层方法处理
​ 不是:内层方法有可能影响到外层方法,但是外层方法是不会影响内层方法的
​(大致可以这么理解,但是有个别情况不同,nested)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值