分布式事务处理技术分享
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
事务的隔离级别---Read uncommitted 读未提交
事务的隔离级别---Read committed 读提交
读提交,只会锁定游标读取到的这一行
事务的隔离级别--- Repeatable read 重复读
事务的隔离级别--- Repeatable read 重复读 实现原理
事务的隔离级别--- 序列化
事务协调者
• 事务执行的步骤记录着,当出现不确定因 素的时候,事务协调者负责重试或者资源 释放,非本地事务都需要有事务协调者 协调者约A和B去爬山,A回答说可以,协调 者记录A同意,协调者再约B,B说不可以, 那协调者要负责告诉A约会取消。 当事务协调者磁盘坏了,就导致事务不知道 运行到哪了,所以磁盘一般会使用RAID10, RAID5来避免磁盘单点问题
死锁及死锁避免
• 死锁 事务1转账A到B,事务2转账B到A,就可能 会发生死锁,当数据库操作需要同时持有 两把锁的时候需要考虑死锁 • 死锁避免 持有锁是顺序的,上面的解决办法是先按账号 排序,然后再一次锁定,就能避免死锁
4、rocketmq的消息一致性方案
实现方案一
实现方案二
5、分布式交易系统实践
微服务化改造引出的问题
1.网络问题 2.传统的ACID被打破
2、网络的不确定性问题
正常服务
业务逻辑没有执行
业务逻辑执行了,但是无响应
3、幂等
Fra Baidu bibliotek
幂等概念关键点
1.幂等性是系统的接口对外一种承诺(而不是实现), 承诺只要调用接口成功, 外部多次调用对系统的影响是一致的。 2.幂等的前提条件,针对一次业务处理 3.标识业务处理的方法,业务ID
事务参与者
• 事务最小单元是本地事务 协调者约A和B去爬山,A,B就是参与者
重试次数限制
• 当A调用B某一个有副作用接口重试了几次 还是不知道结果的时候,可能业务A就做失 败处理,但是控制者A不知道B到底有没有 做的问题 • 处理:当A失败的时候,需要A有一个JOB 去处理这种状态的任务,继续重试调用B, 直到B有明确返回的时候,根据结果调用相 应逆操作。
分布式事务处理实践技术分享
课程内容 1. 2. 3. 4. 5. 事务特性及事务的隔离级别 网络的不确定性问题 幂等及实现方案 rocketmq的消息一致性保障方案 交易系统的分布式事务实践
课程目标 1. 认识分布式事务 2. 在业务处理的时候知道怎么处理分布 式事务
1、事务特性及事务的隔离级别
两阶段提交
两阶段提交
谢谢! Thank You Very Much!
事务
A:原子性(Atomicity) 事务是数据库的逻辑工作单位,事务中包括的诸 操作要么全做,要么全不做。 C:一致性(Consistency) 事务执行的结果必须是使数据库从一个一致性状 态变到另一个一致性状态。一致性与原子性是密 切相关的。 I:隔离性(Isolation) 一个事务的执行不能被其他事务干扰。 D:持续性/永久性(Durability) 一个事务一旦提交,它对数据库中数据的改变就 应该是永久性的。
幂等工作模型
18
幂等工作模型
19
接口幂等实现方案
• 单独的去重表 如果涉及到的去重的地方特别多,例如ERP系统中有 各种各样的业务单据,每一种业务单据都需要去重, 这时候,可以单独搞一张去重表,在插入数据的时 候,插入去重表,利用数据库的唯一索引特性,保 证唯一的逻辑。 • 状态机幂等 在设计单据相关的业务,或者是任务相关的业务,肯 定会涉及到状态机,就是业务单据上面有个状态, 状态在不同的情况下会发生变更,一般情况下存在 有限状态机,这时候,如果状态机已经处于下一个 状态,这时候来了一个上一个状态的变更,理论上 是不能够变更的,这样的话,保证了有限状态机的 幂等。
投保流程
Schedule-app工作流程
mq-app工作流程
分布式事务实现
• 重试(基于状态流程的JOB重试和MQ消息 重复投递或者发送) • 逆操作(冻结操作和解冻操作,转账操作 和退款操作) • 实操作转换成虚拟操作(消息不是马上发 出去,当业务成功的时候插入一条待发消 息) • 两阶段提交(控制者保存任何时刻的状态) • 接口幂等
乐观锁和悲观锁使用
• 乐观锁 在数据表中间增加version字段,表行修改的时 候count=update A SET version=version+1 where version=之前读取的值,当其中一个线 程修改了数据行的时候版本号增加了,第二个 修改的线程update 返回的修改行数就是0了, 这样就避免了并发修改问题,乐观锁的ABA问 题? • 悲观锁 Update A set update_time=当前时间 where id=111 and status=前置状态,hold住这行, 执行业务逻辑, Update A set update_time=当前时间 where id=111 and