没有合适的资源?快使用搜索试试~ 我知道了~
首页银行转账失败启示:深入理解分布式事务与ACID原理
银行转账失败启示:深入理解分布式事务与ACID原理
1 下载量 123 浏览量
更新于2024-08-28
收藏 273KB PDF 举报
在"从银行转账失败到分布式事务:总结与思考"一文中,作者分享了一次个人经历,即银行转账失败引发对分布式事务的深入研究。文章首先定义了事务在编程中的概念,强调它是一组逻辑完整、前后一致的操作集合,要么全成要么全败,体现了ACID特性:原子性(保证操作要么全部完成要么全部不执行)、一致性(保持数据在事务前后的状态一致性)、隔离性(避免并发事务间的干扰)和持久性(操作结果不可撤销)。 在关系型数据库如MySQL、SQL Server或Oracle中,事务是确保数据操作正确进行的关键机制。在转账这个例子中,扣减UserA账户100元并增加UserB账户100元的操作,必须在原子性下同时完成,确保用户账户余额的准确性。 然而,当转账发生在分布式环境中,问题就复杂化了。因为参与者分布在不同的节点,传统的两阶段提交或四阶段提交协议不足以保证全局的一致性。这时,分布式事务需要更复杂的协调机制,例如两阶段乐观锁、三阶段提交或者TCC(补偿、承诺、撤销)模式,来处理可能出现的网络延迟、故障等问题。 文章中提到的银行转账失败事件引发了对分布式事务挑战的反思,即如何在分布式系统中保证即使面对网络分区、系统故障等情况,也能维持数据的一致性和完整性。作者可能进一步探讨了分布式事务解决方案,如Paxos、Raft等共识算法,以及在实际应用中如何选择合适的分布式事务解决方案,以确保交易的正确执行和系统的可用性。 这篇文章不仅回顾了基础的数据库事务概念,还深入剖析了分布式事务的复杂性,通过实例和理论相结合的方式,帮助读者理解分布式事务在现实生活中的挑战与应对策略。
资源详情
资源推荐
从银行转账失败到分布式事务:总结与思考从银行转账失败到分布式事务:总结与思考
正文正文
思考这个问题的初衷,是有一次给朋友转账,结果我的钱被扣了,朋友没收到钱。而我之前一直认为银行转账一定是由事务保
证强一致性的,于是学习、总结了一下分布式事务的各种理论、方法。
事务是一个非常广义的词汇,各行各业解读都不一样。对于程序员,事务等价于Transaction,是指一组连续的操作,这些操
作组合成一个逻辑的、完整的操作。即这组操作执行前后,系统需要处于一个可预知的、一致的状态。因此,这一组操作要么
都成功执行,要么都不能执行;如果部分成功,部分失败,成功的部分需要回滚(rollback)。
姊妹篇: 再论分布式事务:从理论到实践
关系型数据库事务
大多数人可能和我一样,第一次听说事务是在学习关系型数据库(mysql、sql server、Oracle)的时候,在关系型数据库中,
如果一组操作满足ACID特性,那么称之为一个事务。关于关系型数据库的ACID 特性,不管是教材还是网络上都有大量的资
料,这里只简单介绍。
A(Atomic):原子性,构成事务的所有操作,要么都执行完成,要么全部不执行,不可能出现部分成功部分失败的情况
C(Consistency):一致性,在事务执行前后,数据库的一致性约束没有被破坏。这里的一致性含义后面会详细解释
I(Isolation):隔离性,数据库中的事务一般都是并发的,隔离性是指并发的两个事务的执行互不干扰,一个事务不能看到其
他事务运行过程的中间状态
D(Durability):持久性,事务完成之后,该事务对数据的更改会被持久化到数据库,且不会被回滚。
我们举一个简单的转账的例子,用户A给玩家B转100块钱,那么涉及到两个操作:玩家A的账户扣100元,玩家B的账户加100
元。即
UserA.account -= 100
UserB.account += 100
原子性很好理解,这两个操作要么都成功,要么都不执行(更准确的是从效果上来看等价于都没有执行)。不可能出现用户A
的钱减少了而用户B的钱没增加的情况,用户是不允许的;更不可能出现用户B的钱增加 而 用户A的钱没有减少的情况,银行
是绝对不干的。
一致性说一起来大家都懂,但是深究起来也是似懂非懂。ACID中的一致性,网络上的介绍都很模糊,都是说要处于一致的状
态,那什么是一致的状态呢,比如转账操作中,A扣钱,B加钱,AB的钱的综合是一定的,这个是否属于ACID中的
Consistency呢?我觉得不是的, Wiki Transaction_processing 和 Wiki: ACID 分别是这么描述的
Consistency: A transaction is a correct transformation of the state. The actions taken as a group do not violate any of the
integrity constraints associated with the state.
The consistency property ensures that any transaction will bring the database from one valid state to another. Any data
written to the database must be valid according to all defined rules, including constraints, cascades, triggers, and any
combination thereof. This does not guarantee correctness of the transaction in all ways the application programmer
might have wanted (that is the responsibility of application-level code), but merely that any programming errors cannot
result in the violation of any defined rules.
上面黑色加粗的部分指出,ACID中的一致性是指完整性约束不被破坏,完整性包含实体完整性(主属性不为空)、参照完整
性(外键必须存在原表中)、用户自定义的完整性。用户自定义的完整性比如列值非空(not null)、列值唯一(unique)、
列值是否满足一个bool表达式(check语句,如性别只能有两个值、岁数是一定范围内的整数等),例如age smallint CHECK
(age >=0 AND age <= 120).数据库保证age的值在[0, 120]的范围,如果不在这个范文,那么更新操作失败,事务也会失败。
另外,向mysql中的cascade,以及触发器(trigger)都属于用户自定义的完整性约束。在MongoDB3.2中 document
validation就是用户自定义的完整性约束,在插入或者更新docuemnt的时候检查,不过用户可以自行设定validationAction,确
定当数据不符合约束时的表现,默认为error,即拒绝数据写操作。
因此,用户A,B在这次事务操作前后,账户的总和一定,是应用层面的一致性,而不是数据库保证的一致性,应用层面的一
致性事实上是由原子性来保证的。
隔离性说起来简单,但事实上背后的事情很复杂,数据库的隔离性依赖于加锁或者多版本控制。简单来说,如果
UserA.account初始值为500,执行完第一条指令(即减去100),但事务还没有提交,其他的事务是不能读到这个中间结果
(UserA.account的值为400)的。这就是避免了脏读(Drity Read),对应的隔离级别就是READ_COMMITTED。在SQL标
准中,定义了四个隔离级别:
下载后可阅读完整内容,剩余5页未读,立即下载
weixin_38550722
- 粉丝: 8
- 资源: 928
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 十种常见电感线圈电感量计算公式详解
- 军用车辆:CAN总线的集成与优势
- CAN总线在汽车智能换档系统中的作用与实现
- CAN总线数据超载问题及解决策略
- 汽车车身系统CAN总线设计与应用
- SAP企业需求深度剖析:财务会计与供应链的关键流程与改进策略
- CAN总线在发动机电控系统中的通信设计实践
- Spring与iBATIS整合:快速开发与比较分析
- CAN总线驱动的整车管理系统硬件设计详解
- CAN总线通讯智能节点设计与实现
- DSP实现电动汽车CAN总线通讯技术
- CAN协议网关设计:自动位速率检测与互连
- Xcode免证书调试iPad程序开发指南
- 分布式数据库查询优化算法探讨
- Win7安装VC++6.0完全指南:解决兼容性与Office冲突
- MFC实现学生信息管理系统:登录与数据库操作
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功