Java项目《谷粒商城》架构师级Java项目实战,对标阿里P6-P7,全网最强
总时长 104:45:00 共408P
此文章包含第284p-第p290的内容
简介
模拟积分服务出异常,前方的锁库存事务未回滚,这时候就需要分布式事务
本地事务
事务的隔离级别
spring 调整隔离级别 使用@Transactional的isolation属性
事务的传播行为
下图的情况 报错后 a和b一起回滚 c因为开了一个新事务,所以不回滚
使用required了,它的其他配置就无用,就是使用他的共用的那个事务的配置
坑!!!切记 这里的abc三个方法都在一个类里面 这样会导致跳过代理 导致b和c的@Transactional失效,修改的话 使用xxxService.b()这样可以,或者使用下面的方法
解决方法:
- 引入aop场景
使用代理对象来调用
分布式事务
CAP定理和BASE定理
这三者无法同时实现 只能是cp ap 或 ac(基本无法实现ac)
使用算法保持一致性 cp
动画
发生错误后没提交的数据都进行回滚 然后复制新领导的命令日志进行操作
一般我们都使用a和p
base理论
最终一致性
例如 这里库存已经扣了,但是订单和积分已经回滚了 过一段时间发现没有这个订单(或 生成订单 但订单状态已关闭) 这样的话再把库存加回去
分布式事务的几种方案
2pc模式
tcc事务补偿方案(TCC补偿 这个阿里在用)
相当于自己写回滚逻辑(如库存加了2个,进到cancel逻辑就要减2) 缺点:侵入式太强
最大努力通知型方法
如支付宝支付成功后 会一直发给订单模块 告诉他已经支付成功了,直到订单模块执行完业务,并且返回通知(知道了,我已经执行完了)给支付宝,支付宝才停止发送通知
可靠消息+最终一致性方案
seata
这个表相当于一个操作的日志的暂存器(改之前先记录一下) 将事务执行之前的数据存在里面,如果事务失败了 则回滚回去(魔改数据库)
每个数据库都加了这个回滚日志表
seata示例
不想找bug就用老师的版本的,新版本完全不一样了
seata1.4.2可以在配置文件里配置,以 seata 开头,下面就会有配置信息的提示
springboot2.0以下可以用
注意:在Seata0.9版本以后,提供了DataSource默认代理的功能,并且默认是开启的,不用再手动的去把DataSource放入到DataSourceProxy中了
seata依赖引到common里面的 其他模块记得排除不然启动不了
seata无法使用在高并发场景,因为加了很多锁,相当于把并发变成了串口化了,所以这里我们在高并发场景不使用seata,使用最大努力通知型方法和可靠消息+最终一致性方案,下个视频继续