(PS:黄色字体为二次修改的内容)

关于事务的一致性,《数据库系统概念》中是这样描述的

第二段说的三个特性是指原子性、隔离性、持久性。

就算这样,相信大家也是懵懵的,我也是,所以才会写下这篇博客。

看到别的博客说,一致性是事务的最终目的,原子性、隔离性、持久性都是为了实现一致性。

在这里,我打算验证一番。

怎么验证呢?

假设,这个事务系统如果是由我们来设计的话。

首先,场景是这样的,小范转100块钱给小黄,那么这个事务系统必须要保证小范扣了100块钱,而且小黄也必须要加了100块钱。

这个我们要怎么保证呢?

有了,我们可以先用一本本子记下来,小范扣100块钱,小黄加100块钱,然后,我们再根据本子上写的,顺序执行,这样的话,小范或者小黄就没法耍赖了。

OK,那么我们现在就开干,把这个事务系统开发出来,下面是伪代码:

//事务系统
abstract class transaction{void transaction(){/* todo:将所有操作写进日志* args: 事务名称, 事务操作, 事务写入状态(0 未写完 1已写完)*/setLog("小范转100块钱给小黄", "小范-100", 0);setLog("小范转100块钱给小黄", "小黄+100", 1);//获取日志Log logs = getLog("小范转100块钱给小黄");//解析日志,获取操作事件Event events = parseLog(logs);//执行操作并回写日志状态标记该事务已完成doEvent(events, logs);}}

OK,系统开发出来了,我们把它应用上去跑起来试下。

但是,可能是因为计算机内存不够,系统跑到一半,闪退了。。。

也就是doEvent的时候,小范扣了100块钱,这个时候闪退了。。。

上数据库一看,完了,小范已经扣了100,但是小黄并没有增加100,事务也没有执行下去。

所以我们这个事务系统是有问题的,我们的事务系统,应该要保证小范扣100,而且小黄也要加100,我们姑且称这种状态为一致性,因为我们要保证这两个操作对数据而言是一致的嘛。

从目前来看,我们这个事务系统,没有完全实现一致性,那如果发生了这种状况,系统闪退停机等等异常情况,我们该怎么处理,才能保证一致性呢?

有了,我们可以在日志中多加一个状态,用来标记该操作有没有执行,然后用一个定时器,每隔几秒找出日志中没有完成的事务,把它执行完,这样一来,就能保证小范扣了100,小黄加了100了,哪怕中途停机了,也能用定时器把事务执行完。

就这样测试了十来次,结果跟操作都一致,确实能保证一致性了,就正式给用上生产环境了。

可是才不到一天,就出问题了,怎么呢?有个业务,小张向老李转账300元,可是小张的账户上只有298,该死的初级程序员又没有对小张的金额作校验,直接就给执行了。

这下小张的账户余额变成了-2,老李的账户变成了300。闹了个大笑话。

这虽然主要责任不在我们开发的事务系统,但是,我们也要做处理,也就是在小张的余额做加减的时候,减成了负数,这个时候程序应该需要抛出异常的,不能让程序再执行下去了,所以,这就需要我们的事务系统,可以在执行到一半的时候,回滚到初始状态。

也就是说,如果同一个事务中,有操作ABC三个顺序操作,操作A成功了,操作B失败了,那这操作C还要执行吗?当然不能,这种情况,B失败了,我们就只能把A给回滚到操作之前。

这样一来,我们这个事务系统就是,要么事务都完成,要么事务都不完成,我们姑且就把这个叫做原子性吧。

增加了原子性的功能后,事务系统又开始跑了。

过了几天,又出问题了,怎么呢?原来啊,小范有300块钱,小张向小范转了500块钱,事务还没操作完呢,小刘又给小范转了300块钱,这样一来,问题就来了,小张给小范转500,本应该事务结束的时候小范有800块钱,可是小刘又给小范转了300,还是用小范原有的300去增加的,这样一来,小刘的事务结束,小范就有600块钱,小张的事务执行完,把800写回给小范,接着,小刘的事务也执行完,把600写回给小范,导致最终小范账上只有600块钱,小张的500被吞了。

这样,数据完全混乱了。问题出在哪呢?在于小张事务执行的时候,读取到小范有300,事务没完,小刘也读取到小范有300,这样就错乱了,我们应该要让小张在转账的时候,小刘要等小张转完了,才能转。这样,才能解决掉数据混乱的问题,我们,姑且把这个叫做隔离性。

隔离性修复完之后,项目又开始运作了,事务系统运行了很长一段时间,也没有出现问题。

到这里,验证就结束了,上面写日志的行为其实就是事务的持久性,也可以看到,上面出现的隔离性、原子性、持久性,也都是为了彻底实现一致性而产生的。

所以,总的来说,一致性是一个比较笼统的概念,是事务的基础,一致性和原子性的区别就是,原子性强调的是操作的完整,要么都成功、要么都不成功,而一致性包含的比较多,数据的一致性啊等等。

不过其实,我觉得一致性不应该跟原子性、隔离性、持久性放在一起,因为这三个都是为了实现一致性,如果有大佬知道,麻烦跟我说下原因。

到这,本文就结束了,写的真的不是很好,以后,要是我对事务一致性、原子性有了新的理解,我会再回来修改的,也欢迎各位大佬留言或者私聊我,给我写关于一致性的启发。

知乎上有个回答也是写的蛮好的,大家可以看看,https://www.zhihu.com/question/30272728

什么是事务的一致性?一致性和原子性的区别是什么?相关推荐

  1. 分布式事务——消息最终一致性方案

    前言 分布式事务一直是服务化拆分后一个绕不开的话题,原来在单体应用中执行的多个逻辑操作,现在被拆分成了多个服务之间的远程调用.虽然服务化为我们的系统带来了水平伸缩的能力,然而随之而来挑战就是分布式事务 ...

  2. 数据库事务、分布式一致性和分布式事务

    文章目录 什么是事务 事务(ACID)的特性 对事务一致性的理解 分布式一致性 CAP BASE 分布式事务 本地事务 柔性事务和刚性事务 分布式一致性和分布式事务的理解 一致性协议 向量时钟 NWR ...

  3. 简单理解mysql事务_如何理解数据库事务中的一致性的概念?

    比较支持@Kai Peng 的答案,只是缺少例子说明. 而其他一些人的答案甚至有明显的错误.最近正好也在研究这方面的东西,不算是回答,就是跟大家讨论讨论. 首先,我们需要搞清楚为什么会出现事务.[1] ...

  4. mysql数据库事务的概念_如何理解数据库事务中的一致性的概念?

    比较支持@Kai Peng 的答案,只是缺少例子说明. 而其他一些人的答案甚至有明显的错误.最近正好也在研究这方面的东西,不算是回答,就是跟大家讨论讨论. 首先,我们需要搞清楚为什么会出现事务.[1] ...

  5. 使用MQ来保证分布式事务的最终一致性

    使用MQ来保证分布式事务的最终一致性 使用MQ来保证分布式事务的最终一致性 参考URL:https://www.bbsmax.com/A/obzbM9QVdE/ 生产者的逻辑 1.订单入库 2.消息记 ...

  6. MQ如何保证分布式事务的最终一致性

    分布式事务:业务相关的多个操作,保证他们同时成功或者同时失败 最终一致性:与之对应的就是强一致性 MQ中要保证事务的最终一致性,就需要做到两点 1.生产者要保证100%的消息投递.事务消息机制 2.消 ...

  7. 分布式事务及分布式系统一致性解决方案

    在分布式系统中,同时满足"一致性"."可用性"和"分区容错性"三者是不可能的.分布式系统的事务一致性是一个技术难题,各种解决方案孰优孰劣? ...

  8. 【分布式事务】最终一致性解决方案

    对于分布式事务一般采用的都是最终一致性方案,而不是强一致性.而在使用最终一致性的方案时,一定要提到的一个概念是状态机. 什么是状态机?是一种特殊的组织代码的方式,用这种方式能够确保你的对象随时都知道自 ...

  9. DotNetCore.Cap分布式事务实现最终一致性

    项目演化过程中,微服务已经遍地开花.一个大项目下几十上百个微服务已经是常态.但衍生出另外一个问题就是跨微服务事务,跨库事务的分布式事务.市面了解过的有2CP.3CP.TCC等等分布式事务解决方案,各有 ...

最新文章

  1. 关于struts1的配置
  2. 悲剧的程序员用程序写出的爱情
  3. 权重随机算法的java实现
  4. windows 10 systeminfo命令查看系统信息
  5. kotlin 查找id_Kotlin程序查找Square区域
  6. Oracle里silent,静默方式(silent)安装Oracle软件
  7. mysql添加新用户 开放外网访问
  8. oracle按用户采集信息,oracle 11g 手动收集用户统计信息
  9. dwz java_dwz.cn接口java客户端实现
  10. mavros常用消息类型表
  11. 笔试c语言编程题技巧,c语言笔试题答题技巧
  12. jQuery API 的特点
  13. 腾讯云短信服务在项目中的使用
  14. quartus13.0用原理图输入法设计8位全加器
  15. Deepin Linux下编译并运行Proxmark3
  16. Link warning:LNK4199 解决
  17. EXCEL学习笔记----EXCEL操作
  18. CentOS 基础命令 III
  19. tanh函数图像以及求导
  20. 什么情况下mysql innodb会发生回表操作?

热门文章

  1. 那些花儿!吉他简谱~
  2. AEJoy —— 表达式之模拟弹簧【JS】
  3. 数商云跨境电商平台运营总结:整合渠道+深引流量
  4. 【工具】百度网盘视频类资源下载新思路,轻松优雅解决下载限速方法
  5. 【zhailu】国外产品经理到底在做些什么?【转载内容】
  6. 齐博x1如何调用系统自定义字段
  7. 闲人闲谈PS之十七——系统切换带来的冲击
  8. Beacon of BLE
  9. 第四次的面试 C++ 面试 (迷茫) + (复习知识点)
  10. C-DOCSIS PHS,服务组