查看: 74|回复: 0

从银行转账失败到分布式事务:总结与思考

[复制链接]

该用户从未签到

发表于 2019-11-3 21:18:35 | 显示全部楼层 |阅读模式
  思考这个题目的初衷,是有一次给朋友转账,效果我的钱被扣了,朋友没收到钱。而我之前一直以为银行转账一定是由事件保证强划一性的,于是学习、总结了一下分布式事件的各种理论、方法。
  事件是一个非常广义的词汇,各行各业解读都不一样。对于步伐员,事件等价于Transaction,是指一组一连的操纵,这些操纵组合成一个逻辑的、完整的操纵。即这组操纵执行前后,系统须要处于一个可预知的、划一的状态。因此,这一组操纵要么都成功执行,要么都不能执行;如果部分成功,部分失败,成功的部分须要回滚(rollback)。
  姊妹篇:再论分布式事件:从理论到实践
  本文地址:http://www.cnblogs.com/xybaby/p/7465816.html
关系型数据库事件

  大多数人可能和我一样,第一次听说事件是在学习关系型数据库(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_processingWiki: 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

相关技术服务需求,请联系管理员和客服QQ:2753533861或QQ:619920289
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

帖子推荐:
客服咨询

QQ:2753533861

服务时间 9:00-22:00

快速回复 返回顶部 返回列表