互联网一致性架构设计 -- 事务一致性
按业务区分
- 单库事务
- 多库事务
例子:用户下了一个订单,需要修改余额表,订单表,流水表
单库事务
start transaction; CURDtable t_account; any Exception rollback; CURDtable t_order; any Exceptionrollback; CURDtable t_flow; any Exceptionrollback; commit;
多库事务:将缘分一起执行的事务,拆分成多个小的
start transaction1; //第一个库事务执行 CURDtable t_account; any Exception rollback; … // 第一个库事务提交 commit1; start transaction2; //第二个库事务执行 CURDtable t_order; any Exceptionrollback; … // 第二个库事务提交 commit2; start transaction3; //第三个库事务执行 CURDtable t_flow; any Exceptionrollback; … // 第三个库事务提交 commit3;
结果:分库后分成了多个小的事务,就不能实现原子性,无法达到事务的效果。
优化方案
- 补偿事务
- 先执行完,最后一起提交
补偿事务
补偿事务是一种在业务端实施业务逆向操作事务,来保证业务数据一致性的方式。
例如:
举个栗子,修改余额表事务为 int Do_AccountT(uid, money){ start transaction; //余额改变money这么多 CURDtable t_account with money; anyException rollback return NO; commit; return YES; } 那么补偿事务可以是: int Compensate_AccountT(uid, money){ //做一个money的反向操作 returnDo_AccountT(uid, -1*money){ }
缺点:
- 不同的业务要写不同的补偿事务,不具备通用性
- 没有考虑补偿事务的失败
- 如果业务流程很复杂,if/else会嵌套非常多层
先执行完,最后一起提交
依然是这个拆分后的几个小事务
start transaction1; //第一个库事务执行 CURDtable t_account; any Exception rollback; … // 第一个库事务提交 commit1; start transaction2; //第二个库事务执行 CURDtable t_order; any Exceptionrollback; … // 第二个库事务提交 commit2; start transaction3; //第三个库事务执行 CURDtable t_flow; any Exceptionrollback; … // 第三个库事务提交 commit3;
优化前
trx1.exec(); trx1.commit(); trx2.exec(); trx2.commit(); trx3.exec(); trx3.commit(); 第一个事务执行200ms,提交1ms; 第二个事务执行120ms,提交1ms; 第三个事务执行80ms,提交1ms;
优化后
trx1.exec(); trx2.exec(); trx3.exec(); trx1.commit(); trx2.commit(); trx3.commit(); 第一个事务执行200ms; 第二个事务执行120ms; 第三个事务执行80ms; 第一个事务执行1ms; 第二个事务执行1ms; 第三个事务执行1ms;
为什么这么做?
优化前:第一个事务成功提交之后,最后一个事务成功提交之前,如果出现问题(例如服务器重启,数据库异常等),都可能导致数据不一致。这个时间比较长,共403ms。
优化后:第一个事务提交后的,最后一个事务提交前,这个时间比较短,共3ms,这样就能尽可能减少出现数据不一致的概率。而且还通用,减少编码量。
缺点:还是存在不一致的情况,但是已经大大降低。
两种优化方案的比较
事务提交时会释放数据库的连接,第一种方案,第一个库事务提交,数据库连接就释放了,后置事务提交的方案,所有库的连接,要等到所有事务执行完才释放。这就意味着,数据库连接占用的时间增长了,系统整体的吞吐量降低了。
相关推荐
除此以外还介绍了一些分布式事务相关的技术,如幂等性、全局一致性ID、分布式对象等。... 6-1 分布式事务介绍 6-2 spring分布式事务实现_使用JTA 6-3 spring分布式事务实现_不使用JTA 6-4 实例1-DB-DB 6-5 实例1-DB-...
第19节--TCC型事务架构设计分析 第20节--TCC型事务框架的源码实现讲解 第21节--TCC型事务方案的项目实战应用介绍 第22节--TCC型事务方案的项目实战应用部署 第23节--TCC型事务方案的项目实战应用测试 第24节--...
微服务下事务一致性的描述,包括CAP,BASE,ACID理论,其中还包括常用的分布式事务的架构介绍,详细介绍了TCC, 最终一致性,多段提交等架构
在微服务系统架构下,通过介绍可靠事件模式、补偿模式、TCC模式来实现数据的最终一致性
从2014年开始,微服务逐渐进入大家的实现,被认为是下...设计到系统,其中绕不开的就是数据一致性,从本地事务,到后来的分布式事务,都能够有效的保证数据一致性。但是在微服务架构中,这两种方式都不是最好的选择。
12.3 数据一致性原则 12.4 高可用及数据安全原则 12.5 小结 第13章 可扩展性设计之MySQL Replication 13.0 引言 13.1 Replication对可扩展性设计的意义 13.2 Replication机制的实现原理 13.3 Replication...
分布式系统的事务一致性是一个技术难题,各种解决方案孰优孰劣? 在OLTP系统领域,我们在很多业务场景下都会面临事务一致性方面的需求,例如最经典的Bob给Smith转账的案例。传统的企业开发,系统往往是以单体应用...
├─基于分布式彻底解决数据库一致性问题.mp4 ├─第二章-03课 智能互联网之核心技术实践篇(中)V4-9.11.pdf ├─第二章第3节分布式事务设计与实现.mp4 ├─第二章第3节分布式锁设计与实现.mp4 (3)\百万4期第三章;...
近日,腾讯云发布了分布式数据库解决方案(DCDB),其最明显的特性之一就是提供了高于开源分布式事务XA的...虽然分布式数据库能解决性能难题,但事务一致性(Consistency)的问题,却很难在分布式数据库上得到解决。
可靠消息最终一致性方案”、于支付系统真实业务中的经典场景来对“ 可靠消息最终一致性方案”、于支付系统真实业务中的经典场景来对“ 可靠消息最终一致性方案”、于支付系统真实业务中的经典场景来对“ 可靠消息...
│ 05 海量并发场景下,如何回答分布式事务一致性问题?.mp4 │ 08 MQ:如何回答消息队列的丢失、重复与积压问题.mp4 │ 09 如何回答 MySQL 的索引原理与优化问题?.mp4 │ 10 如何回答 MySQL 的事务隔离级别和...
事务必须是使数据库从一个一致性状态变到另一个一致性状态,事务的中间状态不能被观察到的 隔离性 一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔 离的,并发执行的...
分布式系统的数据分布、复制、一致性、容错、可扩展性等。范型篇――介绍谷歌、亚马逊、微软、阿里巴巴等著名互联网公司的大规模分布式存储系统架构,涉及分布式文件系统、分布式键值系统、分布式表格系统以及分布式...
微服务分布式事务一致性问题,一直是分布式架构的重点解决问题,保证分布式一致性6种方案,供参考!
#资源达人分享计划#
为了解决大家在实施分布式服务化架构过程中关于分布式事务问题的困扰,本教程将基于支付系统真实业务中的经典场景来对“可靠消息的最终一致性方案”、“TCC两阶段型方案”和“最大努力通知型方案”这3种柔性事务解决...
为了解决大家在实施分布式服务化架构过程中关于分布式事务问题的困扰,本教程将基于支付系统真实业务中的经典场景来对“可靠消息的最终一致性方案”、“TCC两阶段型方案”和“最大努力通知型方案”这3种柔性事务解决...
#资源达人分享计划#
27_如何保证缓存与数据库双写时的数据一致性? 28_你能说说redis的并发竞争问题该如何解决吗? 29_你们公司生产环境的redis集群的部署架构是什么样的? 30_分布式缓存相关面试题的回答技巧总结 31_体验一下面试官...
文档中方案不能彻底解决多库分布式事务数据一致性问题,但能大大降低数据不一致的概率,带来的副作用是数据库连接占用时间会增长,吞吐量会降低。对于一致性与吞吐量的折衷,还需要业务架构师谨慎权衡折衷。