Coding 极简派

你所以为,未必是事实 -论事务与分布式事务(一)

近期看了三个比较印象深刻的电影, 我把他们归结为同一类型,这就是今天的主题– 你所以为,你所目睹,你所相信,未必是事实.

其一是刚刚实至名归获得奥斯卡小金人的莱昂纳多主演的禁闭岛,当年泰坦尼克号里面的Jack也算迷倒众生的形象了, 纵然大叔颜值不复当年,可小李子靠着荒野猎人里面”辛苦的”演技(比如熊斗,吃生肉,爬雪地)终于在无数个擦肩而过之后将小金人收入囊中.禁闭岛中的演技你也可大呼高超, 足足到电影结尾你或者猛然惊醒,或者即便怀疑多个细节也未必可知真相. 在这里就不做剧透了,看过的必知我在说什么,没看过的元旦也可以宅在家里好好玩味一番.

其二是推理悬疑豆瓣高分榜的不可或缺之作 致命ID, 在美国偏僻地方的一个汽车旅馆发生的死亡故事. 故事背后的原理其实并不陌生, 也许大家都知道多重人格这种心理现象. 具有这种精神特质的人会演化出多个从性格到技能完全不同的多种人格, 而这几个人格又会随着外界环境刺激或者自身感情变化来回轮换. 你所看到的汽车旅馆的七个人的死亡际会,其实只是一个多重人格的人的人格间角逐争斗的外围映射.

其三是美国电影 不明身份,讲述一个杀手在和杀手伙伴一起实施行动过程中意外发生车祸而失忆,忘记自己的真实身份,只记得并且坚信自己是当初为了展开杀手行动而伪造的一个身份, 而最终变成了行动的反对和组织者的故事,在不断的求证求真的过程中, 他知道了自己的真实身份,也恢复了部分记忆,但他最终选择了不再做一个杀手,成功保护了险些被暗杀的发现粮食增产方法的植物学家,造福了人类社会.

这三个电影都在结尾才昭示真相,让观众恍然大悟而意犹未尽. 其实本质运用的手法都是–视角不同,或者说维度不同. 片子的观众被安排在了主人公的视角里只能看到这种维度的世界,也就是你所目睹和你所以为的世界, 而这个视角下的世界未必是真实的世界. 倘若你拥有了上帝视角,那么这几部片子对你而言就不再是悬疑片,而成为了枯燥的纪录片.

当这种视角的限制和变换给你带来乐趣,给作家带来写作工具的时候, 它在计算机领域也给我们带来了一些问题.

化学史上很长一段时间内分子是不可再分的,人们像笃信地心说一样笃信分子是最小的结构. 但当越来越多的实验现象用这种理论无法解释的时候,人们才开始探求并打破这个认识,认识到比分子更小的还有原子..(当然比原子小的还有夸克,但是这里不再继续深究)

当我们用任何一种编程语言敲出一行语言的时候,比如最简单的增一

1
2
//int a=0;
a++;

我们从一个天真的程序员视角会想这不是一个简单的原子操作吗,给a加一, 无论你loop多少次,比如100次, 她的结果肯定是100. 难道有什么问题吗?
假设如果你在做这个给a加一的操作,莱昂纳多也在做这个动作[当然他不会的,他还在忙着泡超模].那么结果是2吗? 不一定! 结果可能是2, 也可能是1.这看起来像是一个悬疑片吗?
真相也只需要你换一个视角.

why?

加一的这个操作对于计算机来说并不是一个最小粒度的原子性的操作.
它可以被拆解为:

  • 从存储将a的值读到寄存器
  • 寄存器+1
  • 将寄存器的值写回a的地址

所以如果你在读出a=0后, 在发生3之前,莱昂纳多进来也读取了a=0,然后你们分别做2 的操作然后写回地址,那么结果就是1. 莱昂纳多和你的操作是没有相互独立的,你们分别可见对方的中间态,而且每个独立人的操作是非原子性的.

如果你想避免这种状态的化,可以给这个过程加锁,当你操作a地址的时候,拒绝来昂那多操作a的值,那么你们两个的操作被迫就编程了线性发生.(你不会想在操作银行账户的时候还和来昂那多见个面吧..)

加锁即是把你们共享的状态或者数据进行一个访问限制, 以实现排他性从而实现安全操作.

这种竞争状态还有很多其它场景,比如对于数据库来说, 大家习以为常的insert/delete/update其实都并不是原子性的, 它都要先对数据进行一个读操作,然后进行一个写操作.

对于这种当你希望”你所以为,必是事实”的情况,官方的定义是这是一个事务单元[transaction]. 就是你希望指令按照你所希望的顺序执行,不会出现你意向不到的结果. 便是要实现事务一致性.

今天的闲话扯的太多了,时间有限,匆匆以事务ACID的解释结尾吧.

ACID:

  • 原子性(Atomicity):事务要么成功执行(提交),要么所有的动作都不发生(回滚)。
  • 一致性(Consistency):事务产生一致的结果并且保证程序的完整性约束。
  • 隔离性(Isolation):事务执行时的中间状态对其它事务是不可见的。此外事务应该表现为连续执行,即使实际是并发执行的。两个事务的执行是互不干扰的,一个事务不可能看到其他事务运行时,中间某一时刻的数据。
  • 持久性(Durability):提交事务的结果是永久性的(即使是灾难性的故障)

关于这个宏大的话题下次接着讨论.

PS 今天[12.28]是我的生日.
新开通这个公众号当是我送给自己的一个生日礼物.可以祝我生日快乐~ :P

xubing wechat
奇闻共欣赏,疑义相与析.欢迎来我的微信公众号