赵希言 2021-12-14 16:56 采纳率: 100%
浏览 33
已结题

什么是数据库事务的一致性

事物的其他三个特点很好理解原子性(atomicity)、隔离性(isolation)、持久性(durability),但是网上对一致性(consistency)解释的都很宽泛

官方解释:事务必须是使数据库从一个一致性状态变到另一个一致性状态。

网络上的解释:一般用银行转账举例,一个人多了100元,一个人少了100元,前后总数没有变。

我的理解:一致性是两种事物或两种状态比较才能称为一致或不一致,单个物体不能称为一致性,
官方的解释是数据库具有一致性,而不是数据库被操作前后具有一致性,是不是用”一致性“去翻译”consistency“是错误的,误导了对”consistency“的理解;
网络上解释的一致性指的是数据库操作前后保持一致(类似于能量守恒),但是如果是跨行转账,那对于每个银行的数据库是不是都破坏了一致性,还有当我们执行单条sql语句,增删改都破坏了数据库的一致性,只有查询保证了事务的所有特点,或者说单条sql语句不属于事务。

引发的问题:
1.到底什么是事务的一致性?
2.事务和数据库的关系?
3.是满足四个特点的sql语句组都可以称为事务 还是 不管一条或多条sql都称为事务?
4.如果单条sql语句能称为事务,那增删改是否破坏了事务的一致性。

  • 写回答

3条回答 默认 最新

  • DarkAthena ORACLE应用及数据库设计方案咨询师 2021-12-14 21:43
    关注
    1. 举个例子,有一张这样的表记录了某人的账户余额为100元,
      第一个事务,正在操作将这100元减去10元,因此该账户理论应该为90元,所以执行了一条sql,更新这个余额为90元,但是由于磁盘、内存、cpu的性能限制,这个动作并没有很快完成,此时
      第二个事务进来了,正在操作在此账户上增加10元,由于前一个事务未完成,因此第二个事务查到了该账户目前为100元,所以要更新账户余额为110元,
      很明显,如果不管事务,上面这两个操作不管谁先完成,最后的结果都是错的,不是90就是110.
      所以,程序在设计中,会在每一个要更新某条数据的事务前,先对此数据进行加锁,告诉其他事务该条数据正在更新,请排队。

    2. 再比如,假设该账户拥有某些特殊的福利政策,在某天的某个时间点,该账户的系统后台对所有类似账户发放基于余额5%的分红,但要操作的账户有很多,所以系统要执行很长时间,为避免在发放分红时余额数据还会发生变化,导致数据不可控,所以开启一个事务,在这个事务中,数据只会被本事务更新修改,其他事务无法更新到这个事务中的数据。

    3. 结合上面两个例子,不知道你是否稍微理解一点,我再举个直接的例子吧
      把数字100和数字2存入数据库A,B两个字段
      事务1判断,如果B字段不等于0,就更新A字段等于 A字段除以B字段的结果,
      然而就在事务1刚刚判断完成的时候,事务2跑过来把B字段更新成0了,
      那么此时事务1在更新的时候就会报错,但在程序逻辑上发现不了任何问题。
      然而程序中如果开启了事务控制,保证了事务的一致性,就不会出现此种错误,因为事务2在事务1未完成的时候,是执行不了的,以此保证了事务1的事务一致性,而事务2只能排队

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 2月15日
  • 已采纳回答 2月7日
  • 修改了问题 12月14日
  • 创建了问题 12月14日