ACID特性之一致性
就数据库而言,一致性就是正确性,在任何情况下数据都不会丢失正确性。
即便在执行数以千计的并发事务时,数据库也始终会从一个一致性状态移动到另一个一致性状态。
一致性包括两个方面,一个是系统层面,另外一个是业务(现实)层面。
系统层面,数据库允许我们定义驻留在数据库中的数据需要遵守的规则,比如账号金额不为负数。
数据库为此提供了一系列约束工具,比如主键、唯一索引、外键、列不能为NULL等等。
但是在业务层面,也就是我们所说的现实当中,数据库很难为我们提供保证,比如说两个人进行转账交易,需要保证总金额从始至终都是一致的。
总金额对账一致更多需要我们开发人员来保证。特别是在并发事务执行的情况,如果没有人为干预是会出现一致性问题的。
并发事务下的一致性问题
按照请求时序性,数据库总共存在四种并发情况,分别为“读-读”、“读-写”、“写-读”和“写-写”。
“读-读”操作在并发场景下完全不会出现错误状况,我们所说的并发问题都是夹杂着“写”操作。
那么到底会出现什么并发错误场景呢?网络上大多数文章和书籍基本会列出“脏读”、“不可重复读”和“幻读”这三种场景。
但其实,还有一种场景叫“脏写”,只是MySQL借助锁机制完全屏蔽掉此种场景。
我们依次来说明下这四种错误具体是怎么产生的,以及提出了哪些概念和实现手段来应付。
创建一张Person表如下
create table person { id bigint, name varchar(64), age int, sex varchar, primary key (id)