如何正确理解ACID之一致性

ACID特性之一致性

就数据库而言,一致性就是正确性,在任何情况下数据都不会丢失正确性。

即便在执行数以千计的并发事务时,数据库也始终会从一个一致性状态移动到另一个一致性状态。

一致性包括两个方面,一个是系统层面,另外一个是业务(现实)层面。

系统层面,数据库允许我们定义驻留在数据库中的数据需要遵守的规则,比如账号金额不为负数。

数据库为此提供了一系列约束工具,比如主键、唯一索引、外键、列不能为NULL等等。

但是在业务层面,也就是我们所说的现实当中,数据库很难为我们提供保证,比如说两个人进行转账交易,需要保证总金额从始至终都是一致的。

总金额对账一致更多需要我们开发人员来保证。特别是在并发事务执行的情况,如果没有人为干预是会出现一致性问题的。

并发事务下的一致性问题

按照请求时序性,数据库总共存在四种并发情况,分别为“读-读”、“读-写”、“写-读”和“写-写”。

“读-读”操作在并发场景下完全不会出现错误状况,我们所说的并发问题都是夹杂着“写”操作。

那么到底会出现什么并发错误场景呢?网络上大多数文章和书籍基本会列出“脏读”、“不可重复读”和“幻读”这三种场景。

但其实,还有一种场景叫“脏写”,只是MySQL借助锁机制完全屏蔽掉此种场景。

我们依次来说明下这四种错误具体是怎么产生的,以及提出了哪些概念和实现手段来应付。

创建一张Person表如下

 
 

create table person { id bigint, name varchar(64), age int, sex varchar, primary key (id)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老三炒粿条

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值