精华内容
下载资源
问答
  • 概念 原子性:一个事务内的操作,要么同时成功,要么同时失败 一致性:一个事务必须使数据库从一个一致性状态变换到另一个一致性状态,比如,A转给B,A减钱,...一致性是基础,也是最终目的,其他三个特性(原子性...

    概念

    原子性:一个事务内的操作,要么同时成功,要么同时失败

    一致性:一个事务必须使数据库从一个一致性状态变换到另一个一致性状态,比如,A转给B,A减钱,B没有加上,就没有一致性

    对于一致性,知乎链接中内容如下:

     

    从这段话的理解来看,所谓一致性,即,从实际的业务逻辑上来说,最终结果是对的、是跟程序员的所期望的结果完全符合的

    重点

    一致性是基础,也是最终目的,其他三个特性(原子性、隔离性和持久性)都是为了保证一致性的

    在比较简单的场景(没有高并发)下,可能会发生一些数据库崩溃等情况,这个时候,依赖于对日志的 REDO/UNDO 操作就可以保证一致性

    而在比较复杂的场景(有高并发)下,可能会有很多事务并行的执行,这个时候,就很可能导致最终的结果无法保证一致性,比如(内容来自知乎链接):

     

    即,这个时候,(有高并发)原子性不能保证一致性。因为从单个事务的角度看,不管是事务 1 还是事务 2,它们都保证的原子性(单个事务内的所有操作全部成功了),但最终,它们并没有保证数据库的一致性(因为从逻辑上说,账户 A 应该增加了 200 元,而不是 100 元)

    所以,为了保证并发情况下的一致性,又引入了隔离性的概念

    隔离性:即事务之间感知不到彼此的存在,就好像只存在本身一个事务一样

    而对于怎样实现隔离性,又涉及到了乐观锁和悲观锁的概念(这两个概念还不大懂)

    小小引申:

    不考虑隔离性的时候,可能导致脏读、幻读和不可重复读的问题(这些问题,其实就是导致无法保证一致性的几种情况)

    而隔离级别的概念,就是为了解决上述三个问题

    展开全文
  • 其实一致性和原子性在事务里是两个不太相关,但又很相关的逻辑来的 原子性:这个侧重点是事务执行的完整,一套事务下来,如果有一个失败,那整体失败。也就是要么大家一起成功,要么全都回滚。 一致性:这个侧重点是...

    其实一致性和原子性在事务里是两个不太相关,但又很相关的逻辑来的

    原子性:这个侧重点是事务执行的完整,一套事务下来,如果有一个失败,那整体失败。也就是要么大家一起成功,要么全都回滚。

    一致性:这个侧重点是业务逻辑和规则,一致性的核心一部分是靠原子性实现的,而另一部分是逻辑实现。

    举个例子吧:
    转账:张三给李四转账100元。那数据库假设需要张三扣100,李四加100,记录一条流水。
    如果流水没记录成功,那整体回滚,张三也没转账成功,李四也没多钱。这就是原子性的体现。

    而张三必须扣100,李四必须加100,这个就是一致性了,如果因为某些逻辑原因,导致张三扣了100,流水记录100转账,而李四只加了60。然后这3条操作都成功了,那原子性就符合了,但是一致性就不符合了

    其实在实际应用中肯定不是这么简单的例子的。往往是类似,买东西扣库存这类的逻辑,主表里有库存,库存表里有库存,然后就因为设计缺陷,就算加了事务还是出现了主表库存对不上库存表库存的问题,这个就是一致性不满足的了。

    展开全文
  • 看到别的博客说,一致性是事务的最终目的,原子性、隔离性、持久性都是为了实现一致性。 在这里,我打算验证一番。 怎么验证呢? 假设,这个事务系统如果是由我们来设计的话。 首先,场景是这样的,小范转100块...

    (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

    展开全文
  • 一致性是基础,也是最终目的,其他三个特性(原子性、隔离性持久性)都是为了保证一致性的 在比较简单的场景(没有高并发)下,可能会发生一些数据库崩溃等情况,这个时候,依赖于对日志的 REDO/UNDO 操作就可以...

    一致性是基础,也是最终目的,其他三个特性(原子性、隔离性和持久性)都是为了保证一致性的

    在比较简单的场景(没有高并发)下,可能会发生一些数据库崩溃等情况,这个时候,依赖于对日志的 REDO/UNDO 操作就可以保证一致性

    而在比较复杂的场景(有高并发)下,可能会有很多事务并行的执行,这个时候,就很可能导致最终的结果无法保证一致性,

     

    原子性无法在高并发时保证一致性

    展开全文
  • 为什么会出现事务 [1]Transactions are not a law of nature; they were created with a purpose, namely to simplify the programming model for applications accessing a database....to ignore certain potential ...
  • 数据库特性之原子性和一致性

    千次阅读 2017-07-16 11:27:05
    数据库的四大特性:原子性一致性,隔离性持久性。其中: 原子性:指事务包含的所有操作要么全部成功,要么全部失败回滚; 一致性:指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个...
  • 原子性 一致性 隔离性 持久性 事务可由一条非常简单的SQL语句组成,也可以由一组复杂的SQL语句组成。 事务是访问并更新数据库中各种数据项的一个程序执行单元。在事务中的操作,要么都做修改,要么都不做,这...
  • 数据库管理系统一般采用重执行日志来保证原子性一致性和持久性。重执行日志记录了数据库变化的每一个动作,数据库在一个事务中执行一部分操作后发生错误退出,数据库即可根据重执行日志撤销已经...
  • 最直接的区别是什么-------------------------------------------------------------------------------------
  • 数据库系统概论中解释如下: 原子性:事务中包括的诸多操作...一致性:事务执行的结果必须使数据库从一个一致性状态变到另一个一致性的状态。 Database System Concepts: Atomicity. Either all operations of th...
  • 并发程序正确地执行,必须要保证原子性、可见性以及有序性。只要有一个没有被保证,就有可能会导致程序运行不正确。 原子性:一个操作或多个操作要么全部执行完成且执行过程不被中断,要么就不执行。 可见性:当多...
  • 文章目录ACID特性#1 原子性#2 一致性#3 隔离性#4 持久性 ACID特性 数据库管理系统中事务(transaction)的四个特性(分析时根据首字母缩写依次解释):原子性(Atomicity)、一致性(Consistency)、隔离性...
  • 一致性原子性区别

    千次阅读 2018-12-10 08:26:00
    一直搞不清楚原子性一致性的准确定位,总觉得意思差不多,昨天终于集中精力对这一点进行学习 转载 原子性:这个侧重点是事务执行的完整,一套事务下来,如果有一个失败,那整体失败。也就是要么大家一起成功,...
  • Transaction 也就是所谓的事务了,通俗理解就是一件事情。从小,父母就教育我们,做事情...于是,人们就归纳出事务的第一个特性:原子性(Atomicity)。我靠,一点都不神秘嘛。 特别是在数据库领域,事务是一个非常...
  • 原子性(atomicity) 原子性是指整个数据库事务是不可分割的工作单位。只有使事务中所有的数据库操作执行都成功,才算整个事务成功。如果事务中任何一个SQL语句执行失败,那么已经执行成功的SQL语句也必须撤销,...
  • 1、原子性: 一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。 事务在执行过程中发生错误,会被恢复(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样...
  • 事务一致性原子性区别

    千次阅读 2017-12-29 14:19:50
    其实一致性和原子性在事务里是两个不太相关,但又很相关的逻辑来的 原子性:这个侧重点是事务执行的完整,一套事务下来,如果有一个失败,那整体失败。也就是要么大家一起成功,要么全都回滚 一致性:这个讲的...
  • 数据库管理系统中事务(transaction)的四个特性(分析时根据首字母缩写依次解释):原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability) 所谓事务,它是一个操作序列,这些操作...
  • 在事务的四种特性中,原子性一致性、持久性通过数据库的redo logundo log来完成,redo log称为重做日志,用来保证事务的原子性和持久性,undo log称为回滚日志,用来保证事务的一致性。事务的隔离性通过锁机制来...
  • MySQL 是如何保证一致性原子性和持久性的!

    千次阅读 多人点赞 2020-03-16 09:32:02
    编辑:业余草来源:https://www.xttblog.com/?p=4891今天,我们来简单的看一下 MySQL 的一致性原子性和持久性问题。后面...
  • 事务的本质是保持操作的原子性,保证数据的一致性。事务跟并发没有必然关系。当并发访问某数据的时候,是靠”串行化“来解决竞争问题的。(让并行的程序在竞争的时候串行化) ACID特性 事务是恢复并发控制...
  • 今天,我们来简单的看一下 MySQL 的一致性原子性和持久性问题。后面还扩展了 15 个简单的面试题,希望大家喜欢! 1、Mysql怎么保证一致性的? OK,这个问题分为两个层面来说。 从数据库层面,数据库通过原子性...
  • 原子性 事务中的操作要么都发生,要么都不发生。 一致性 一致性是指在事务开始之前事务结束以后,数据库的完整性约束没有被破坏。这是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性  对...
  • 数据库事务,原子性(Atomic)、一致性(Consistency)、隔离性(Isolation)、持久性(Durabiliy) 很多复杂的事务要分布进行,但它们组成了一个整体,要么整体生效,要么整体失效。这种思想反应到数据库上,就是多条SQL语句...
  • 目的是保证并发编程场景中的原子性、可见性有序性。 下面我们就再来看下,在 Java 中,分别使用什么方式来保证。   原子性 在 Java 中,为了保证原子性,提供了两个高级的字节码指令 Monitorenter ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 196,987
精华内容 78,794
关键字:

原子性和一致性的区别