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

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

问题描述:

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

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

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

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

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

  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只能排队

数据库是冗余的,你能理解吧?
在多个冗余的库之间,数据是一致的,能理解了吗?