什么是事务的一致性?一致性和原子性的区别是什么?

article/2025/10/6 23:38:33

(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


http://chatgpt.dhexx.cn/article/kCWSKv6L.shtml

相关文章

数据库得事务控制详解,什么是事务回滚详解,通俗易懂

常用的存储引擎有InnoDB(MySQL5.5以后默认的存储引擎)和MyISAM(MySQL5.5之前默认的存储引擎),其中InnoDB支持事务处理机制,而MyISAM不支持 事务是一个整体, 由一条或者多条SQL语句组成, 这些SQL语句要么都执行成功, 要么就失败, 只要有一条SQL出现异常, 整个操作就会回滚…

什么是事务?如何执行一个事务?

什么是事务,为什么要使用事务? 事务是指将一系列数据操作捆绑成为一个整体进行统一管理,如果某一事务执行成功,则在该事物中进行的所有数据更改均会提交,成为数据库中的永久组成部分, 如果事务执行时遇到错…

什么是事务,事务的ACID特性

一.什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做。 事务的结束有两种…

SQL中什么是事务

SQL中什么是事务 事务的概念: 事务是在数据库上按照一定的逻辑顺序执行的任务序列,既可以由用户手动执行,也可以由某种数据库程序自动执行。事务就是一些SQL语句组(每条单独的SQL语句也算一个事务),其中事…

什么是事务?事务的特性?

在mysql中,事务是一种机制、一个操作序列,是访问和更新数据库的程序执行单元。事务中包含一个或多个数据库操作命令,会把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执…

粒子群优化算法求解函数最值

一、实验题目 计算如下二元函数的最小值: (其中自变量x、y的范围均为[-50, 50]) 用matlab代码实现。代码必须能一键运行。最后输出x,y和z的最优值及收敛到最优值所需的迭代步数。算法关键参数需要注释清楚(如权重因子、学习因子…

粒子群优化算法python

粒子群优化算法PSO 粒子群优化算法基本原理算法步骤代码实现 粒子群优化算法 一群鸟在随机搜索食物,在这个区域里只有一块食物。所有的鸟都不知道食物在那里。但是它们知道当前的位置离食物还有多远。那么,找到食物的最简单有效的方法就是搜寻离食物最近…

基于粒子群优化算法的函数寻优算法

文章目录 一、理论基础二、案例背景1、问题描述2、解题思路及步骤 三、MATLAB程序实现1、PSO算法参数设置2、种群初始化3、寻找初始极值4、迭代寻优5、结果分析 四、惯性权重1、惯性权重的选择2、 ω \omega ω变化的算法性能分析 五、参考文献 一、理论基础 粒子群算法(parti…

自适应粒子群优化算法的MATLAB性能仿真

UP目录 一、理论基础 二、核心程序 三、测试结果 一、理论基础 粒子群优化(PSO)是一种基于群体的随机优化技术。与其它基于群体的进化算法相比,它们均初始化为一组随机解,通过迭代搜寻最优解。不同的是:进化计算遵循…

PSO粒子群优化算法

1算法简介 粒子群优化算法,在1995年由Eberhart博士和kennedy博士提出,源于对鸟群捕食的行为研究。该算法最初是受到飞鸟集群活动的规律性启发,进而利用群体智能建立的一个简化模型。算法流程图如下所示。 核心公式( 更新速度和位…

PSO 粒子群优化算法

粒子群优化算法(PSO) Particle Swarm Optimization 1、 算法起源 粒子群优化算法(PSO)是一种进化计算技术(evolutionary computation),1995 年由Eberhart 博士和kennedy 博士提出,源于对鸟群捕食的行为研究 。该算法最初是受到…

粒子群优化算法及MATLAB实现

上一篇博客是关于蚁群优化算法的,有兴趣的可以看下 https://blog.csdn.net/HuangChen666/article/details/115913181 1. 粒子群优化算法概述 2. 粒子群优化算法求解 2.1 连续解空间问题 2.2 构成要素 2.3 算法过程描述 2.4 粒子速度更新公式 …

粒子群优化算法(PSO)python实践

1 算法介绍和原理 1.1 算法原理 强烈推荐知乎大佬的这篇文章:粒子群优化算法(Particle Swarm Optimization, PSO)的详细解读 - 知乎 (zhihu.com)。该文章详细介绍了算法的原理、算法流程、参数解释和一些Tips,这里就不过多赘述了。 粒子群优化算法&am…

粒子群优化算法python实现

文章目录 前言一、粒子群优化算法是什么?二、算法流程三、算法的python实现实验结果 前言 首先简单介绍粒子群优化算法,粒子群优化算法的python实现(含代码) 一、粒子群优化算法是什么? 粒子群优化算法(Particle Swa…

【优化算法】粒子群优化算法简介

这里是引用 文章目录 1. 简介2. 涌现复杂性3. 鸟群智能建模4. 代码实现5. Conclusion参考资料 1. 简介 人工智能是计算机科学的一个大领域,它模拟计算机中的智能行为。在此基础上,提出了一种基于元启发式( metaheuristic)的粒子群…

粒子群优化算法(Particle Swarm Optimization)

转自:https://www.cnblogs.com/21207-iHome/p/6062535.html 粒子群算法的思想源于对鸟/鱼群捕食行为的研究,模拟鸟集群飞行觅食的行为,鸟之间通过集体的协作使群体达到最优目的,是一种基于Swarm Intelligence的优化方法。它没有遗…

粒子群优化(PSO)算法

一.算法思想 粒子群算法( Particle Swarm Optimization, PSO)最早是由Eberhart和Kennedy于1995年提出,它的基本概念源于对鸟群觅食行为的研究。设想这样一个场景:一群鸟在随机搜寻食物,在这个区域里只有一块食物,所有的鸟都不知道食物在哪里,但是它们知道当前的位置离食…

智能优化算法——粒子群优化算法(PSO)(小白也能看懂)

前言: 本文主要参考B站的一篇学习视频后,加之自己的理解和浓缩精华,不想看文字的可以直接划到末尾去b站看原视频,非常通俗易懂。 理论知识: 感性认知:如下面一张图片所示。在一个范围内,以三…

智能算法系列之粒子群优化算法

本博客封面由ChatGPT DALLE 2共同创作而成。 文章目录 前言1. 算法思想2. 细节梳理2.1 超参数的选择2.2 一些trick 3. 算法实现3.1 问题场景3.2 python实现 代码仓库:IALib[GitHub] 前言 本篇是智能算法(Python复现)专栏的第三篇文章,主要介绍粒子群优化…

粒子群优化算法(PSO)

粒子群优化算法(PSO) 粒子群优化算法(PSO)是一种进化计算技术,源于对鸟群捕食行为的研究。该算法最初是受到飞鸟集群活动的规律性启发,进而利用群体智能建立的一个简化模型。粒子群算法在对动物及群活动行…