关于事务一致性与原子性的思考

零、事务

事务是一系列动作的合集,拥有ACID四种特性,分别是原子性、一致性、隔离性和持久性,先来简单回顾一下几个特性的含义(咱们从最容易理解的开始),后面讨论下一致性和原子性之间的关系、一致性和隔离性之间的关系。

一、四大特性

持久性,是指事务执行完毕之后,所做的修改能被保存起来,这个很容易理解,但凡是重要的东西,都要像档案一样保存起来,这是我们习惯的做法。

隔离性,是指两个事务之间互不干扰,我改我的,你改你的,咱们之间互不干扰,这也容易理解,彼此分清职责与界限,以免出问题时互相甩锅,人之常情嘛。不过这里有个问题,一定要互相隔离吗,如果不隔离会怎么样?我们先放着这个问题,后面再揭露谜底。

原子性,是指事务的一连串动作要么都完成,要么都不完成。用老江湖的话来说,那就是:“这件事咱们要干就把它干完干好,要么就不干!”

一致性,是指事务执行完毕之后,系统从一个状态转变为另一个状态,仍旧保持一致,没有中间状态。这句话什么意思?听起来和原子性很像哦,系统要么从一个状态变成另一个状态,要么不变,这可不就是原子性了吗?如果你有这个疑惑,那咱们就可以继续往下了。

仔细回想一下,在何时何地我们曾经遇到或听到过“不一致”这个词?
好像,数据库和缓存之间会不一致,刷写不及时,改完数据库还没来得及改缓存,或者是由于并发,缓存和数据库都扣减库存之后,发现总库存不对。
好像,mysql主从之间会不一致,俗称主从延迟,写进主库之后,从库里查不到。
那么一致性到底是什么意思呢?我们先放着这个问题,后面再揭露谜底。

二、事务的本质

在思考一致性之前,我们先来想一下事务的本质是什么。

从群论的角度看,事务本质是一连串动作的集合。在指挥官发号施令之后,众多动作接二连三地执行,“兄弟们冲啊”,直到最后一个动作执行完毕。如果有多个动作,把它们包装成事务,以至于从外界看起来是同一个动作,这是我们提出事务最根本的原因:把多个动作包装成一个动作,many->one。

但是,俗话说:“一个和尚挑水喝,两个和尚抬水喝,三个和尚没水喝”。一个团队中只有一个的人的时候还好,自力更生,奋发图强。但是林子大了什么鸟都有,团队大了什么人都有,很难做到众志成城齐心协力,力往一处使地干好一件事。要想抽象化团队中所有人,把他们当做一个人来,是很困难的。扯这么多,就是想说明事务说起来简单,做起来困难。

下面我们以商品交易业务作为例子,探讨一下事务的一致性。

三、一致性

3.1 单个事务的一致性

假设我们有一个事务,里面是扣减库存的业务逻辑。要扣减某商品1个库存,那么剩余库存减1,已售库存加1,最后剩余库存和已售库存之和(即总库存)仍等于扣减之前的总库存。我们发现,执行完前面一系列动作(事务)之后,总库存不变,执行前后总库存数值保持一致。

这种在事务执行前后总库存不变的特性(一致性),由什么来保证呢?仔细想一想会发现,其实是原子性,减剩余和加已售2个动作,要么全执行,要么全都不执行。

小结:单个事务前后的一致性,可以由原子性保证

3.2 多个并发事务的一致性

假设剩余20个库存,有2个事务同时执行,第一个事务要扣3个库存后来由于某种原因要回滚,第二个要扣10个库存,如果处理得不好,可能会出现下面的时序:
A)第一个事务查询到仍有20个库存
B)第一个事务扣3个库存,将剩余库存置为17
C)第二个事务查询到剩余17个库存,扣10个库存,将剩余库存置为7个
D)第一个事务回滚,将剩余库存置为20个。
两个事务执行完毕之后,剩余20个库存,和我们预想中的10个剩余库存不一致!

怎么样能让最终结果与我们预想的一样呢?可以考虑让两个事务隔离开来,用最严格的方法也就是串行化,先后执行2个事务。

小结:多个事务的并发一致性,可以由隔离性保证

四、小结

虽然第三部分两个小结中指出,事务的前后并发一致性分别由原子性和隔离性保证,但这并不说明一致性=原子性+隔离性,仅仅描述一致性、原子性和隔离性之间的关系

MyBatis使用与原理深入总结

零、前言

对于初阶Java程序员而言,只需在前人们写好的应用框架中编写DAO接口和SQL语句,便能使用MyBatis框架来实现CRUD,实现具体业务。

随着经验逐渐丰富,使用MyBatis的频次变大,需要自己搭建项目,整合数据库驱动程序、连接池、MyBatis、事务和Spring,到这时,我们得深入学习MyBatis的原理,才能很好地完成上述任务,否则,仅参考网络教程和Demo,云里雾里,知其然不知其所以然,存在很大隐患。

这篇总结面对的读者,是接触MyBatis有一段时间的新人,也可以是使用MyBatis好几年的老鸟。

总结内容包括Java JDBC的相关知识、连接池的相关概念、MyBatis的用法和基础语法、MyBatis的原理和源码解析,最后部分是MyBatis和Spring的整合、事务的整合(这段比较有意思,读者可以对照自己的项目,试试更高阶层的整合)。

Read More

高性能SQL总结

零、前言

这份总结中记录如何优化sql语句,其内容包括基本的数据库概念、SQL语法、MySQL架构图、库表优化、索引优化和最重要的查询优化。熟练掌握这些内容,我们在日常的开发工作中就不会因为SQL的问题捉襟见肘,可以游刃有余地面对CRUD。

一、脑图笔记

由于脑图长宽过大,转成jpg图片之后较难打开,所以我把它转成了PDF文件,可以点击链接进行下载:PDF脑图文件

存储引擎InnoDB总结

零、前言

这份总结中记录mysql各个存储引擎的特性,包括InnoDB、MyISAM、Memory、Archive、Maria等,还有InnoDB的架构与特性、文件结构、表空间、索引、锁和事务,另外还有一些性能优化相关的知识。

一、脑图笔记

由于脑图长宽过大,转成jpg图片之后较难打开,所以我把它转成了PDF文件,可以点击链接进行下载:PDF脑图文件

红黑树浅析(Java)

零、前言

重新研究HashMap和ConcurrentHashMap时(1.8版本),再一次遇到红黑树概念,以前不太留意,现在简单地理解一下红黑树。

一、性质

红黑树本质上是一种二叉查找树(就是那种可以实现二分查找,时间复杂度为O(logN)的二叉树),而且它解决了二叉查找树可能会退化成链表的缺点(这个就很牜了,不过为了解决退化的问题,红黑树的维护代价也高)。

为了防止退化,红黑树有5个约定:

  1. 根节点只能是黑色
  2. 叶子节点只能是黑色(注意:红黑树的叶子节点和B+树不一样,前者叶子节点中不放数据,后者存放数据)
  3. 任何节点要么是红色,要么是黑色,有点霸道呵
  4. 从任何节点到叶子节都有相同数量的黑色节点
  5. 红色节点只能下挂黑色节点,而黑色节点没有限制,既可以下挂红色,也可以下挂黑色。

从约定4和约定5,可以推导出红黑树中最长路径最多只能是最短路径的2倍(最短的路径必然全是黑色节点,最长的路径必然是间隔一红一黑),在如此严格的约定下,红黑树根本不可能退化成一条贼长的链表。

下面是红黑树的示意图(看起来确实只有红和黑2种颜色哈哈):

Read More

创业团队CI/CD运维自动化综合解决方案

1 序言

对于初创团队的后台RD来说,除了开发和测试外,发布代码与机器运维工作也需花费大量时间(配备专门SRE的例外),另外,在发布过程中保证服务可用也是个复杂的问题。

本文的目的便是要解决以上问题,给出运维自动化解决方案,搭建一套私有云,实现自动CI/CD,降低运维成本,让开发人员专注于开发。

Read More

冒死记录上海神秘事件(6)

志同道合的兄弟,有一天也会变得志不同道不合,想到这,邱永臣开始筹划着跟大葱告别了。
生活中没有演不完的戏,天下没有不散的宴席,长大以后才发现,身边大多数告别,其实就是永别。为了维护固定的朋友数量,我们不断地结交新朋友,同时,源源不断的有一部分旧友消失在茫茫人海里。

冒死记录上海神秘事件(5)

1.个体的力量是很渺小的,要学会借助群的力量,也就是群众理论里的精髓,他山之石可以攻玉,众志成城,水滴石穿,铁杵磨成针等等等等,明白这一点,是从强者迈向圣人很重要的一步。

2.无论是谁,哪怕是我,说你不行,你也不要相信,只有你才能决定自己行不行。

3.世上本无路,走的人多了便有路。其实呢,世上本没有架构,讨论的人多了,大家约定俗成也就有了架构。

4.人生是如此的艰难,以至于许多人在无可奈何之后沦陷。

5.大葱临走前,需不需要找本书给他学习无产阶级革命立场观呢?不用了,在国内他接受中国特色社会主义教育,出国后也能做个德智体美三好打工仔。

6.为何人与人之间总会有隔阂,无法达到心灵和灵魂上的一致?那是因为人们能看到、想到和遇到的事情不一样。
吃瓜群众甲遭人嫉妒和排挤,被人说是:“分享脑子里想的东西,不分享出来憋在心里,把头撑炸了就不好了”,甲觉得很难受。在群众乙看来呢,这只是开玩笑而已。
每个人都独立的,没有亲身经历他人的过往,无法理解,无法感受,饱汉子不知饿汉子饥,饿汉子不知饱汉子减肥的辛苦,这简直就是麦克斯韦尔的魔鬼。
人人都能换位思考,为他人着想,天下大同,这是我们对美好生活的向往,也仅仅是向往。

冒死记录上海神秘事件(4)

注:本文均为素材,资料采集自人类世界或非人类世界,记录者是邱永臣,以上。

1.整天牛哄哄的让人讨厌,何从发现现实中这样的人有很多。

其实呢,何从年轻的时候喜欢争强好胜,引发羊群效应,周边的人学着他,不管遇到什么事,第一反应都是:“你不对,你错了,不是这样,不是那样……”
意识到这点之后,何从觉醒过来,深入中庸道,开始玩群论。

2.以前,有人在身旁耐心告诉自己该做什么该怎么做,渐渐地,越往后边,身边的人都无影无踪,那话外音那回音壁消失了,何从开始陷入迷茫:“路它在哪儿?路该往哪个方向,路该怎么走,得给我这群众指条明路呀,总不能让群众背着行囊胡冲乱撞奔小康吧”。

后来想明白了,理论指导实践。任何事物都有一套理论和方法,都有内在的逻辑和道理,掌握了它们,也就知道了具体要做什么和怎么做。大葱笑道:“看来你很快就能理解,创始人们在建立中国时引入马克思主义的缘由了。”

3.什么事都得两面看,不,得全面看。

4.中国人信基督教纯属落后,是在开历史倒车,就算你跑到月球上人家也要把你拉回来。

5.其实教授们的内心是很孤独的,他们做了大量有意义的工作,可是在外人眼里,无法理解,无法感受。

6.理论联系实践,空有理论,没有经过验证也不行,正所谓实践检验真理就是这么个意思。理想是美好的,现实是骨感的。

7.各司其职,各自做好分内的事。这话听起来简单易懂,可是,为了彻底领悟它,需要付出很大代价、受尽折磨与煎熬。

8.大师说:“当一个人崇尚不劳而获,或者觉得努力无意义,绝对要远离他”
邱永臣在旁边听着略有点难做,因为现今主流思潮正在倾向不劳而获。

冒死记录上海神秘事件(3)

1.“宗教是好的,信教你可以得到真理、得到永生,谁不渴望永生呢”。想起上面这句话,是因为何从听到了下面这句话:“接触基督教这么久了,怎么还没信主呀,是不是有什么东西绊倒你啊?”

何从心想:“那绊倒我的就是真主阿拉的闪光点,不知道两边的神打起来到底谁厉害”。

2.何从说:“时间旅行,对普通人来说还是太难理解,相对论都把我们弄晕了”,

邱永臣说:“时空是一体的,人能在空间里边旅行,就没理由不能在时间里旅行。人们常说美国的今天就是我们的明天,你从第三世界往发达国家走,所见所闻都是未来才会发生的事,就像乘坐时空胶囊穿越去到将来,你从第三世界到非洲地区走一趟,到处都是贫穷、饥饿与疾病,仿佛又回到了过去,这不就穿越时空了嘛。”

3.有一天何从问他爸:“你们那一辈人是不是不流行当程序员呀”,他爸给何从讲起了他某天听到的公司里一对不是程序员的男女的对话。

大意如下:
男领导:“程序员都很闷,我当年读书就专门找他们打架,每次我都赢,管理他们简单得很,随便下达个指令他们就乖乖地给我干活,非常容易使唤,不像其他人,尤其是女的,时不时闹情绪不肯干活,还要花心思哄,越漂亮的脾气越大。”
女下属不停点头:“是是是,您说得对……”

何从他爸听到这段对话之后,不久就离开了那家公司,至于为何,后人不得其解。