1导读
数据的一致性是数据准确的重要指标,那如何实现数据的一致性呢?本文从事务特性和事务级别的角度和大家一起学习如何实现数据的读写一致性。
2一致性
1.数据的一致性:通常指关联数据之间的逻辑关系是否正确和完整。
举个例子:某系统实现读写分离,读数据库是写数据库的备份库,小李在系统中之前录入的学历信息是高中,经过小李努力学习,成功获得了本科学位。小李及时把信息变成成了本科,可是由于今天系统备份时间较长,小李变更信息时,数据已经开始备份。公司的HR通过系统查询小李信息时,发现还是本科,小李的申请被驳回。这就是数据不一致问题。
2.数据库的一致性:是指数据库从一个一致性状态变到另一个一致性状态。这是事务的一致性的定义。
举个例子:仓库中商品A有件,门店中商品A有10件。上午10点,仓库发送商品A50件到门店,最后仓库中有商品A50件,门店有商品A60件,这样商品的总是是不变的。不能门店收到货后,仓库的商品A还是件,这样就出现数据库不一致问题。仓库和门店商品A的总数是才是正确的,这就是数据库的一致性。
3数据库事务
数据库事务(transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。
事务的性质:
原子性(Atomicity):事务中的全部操作在数据库中是不可分割的,要么全部完成,要么全部不执行。
一致性(Consistency):几个并行执行的事务,其执行结果必须与按某一顺序串行执行的结果相一致。
隔离性(Isolation):事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的。
持久性(Durability):对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障
4并发问题
数据库在并发环境下会出现脏读、重复读和幻读问题。
1.脏读
事务A读取了事务B未提交的数据,如果事务B回滚了,事务A读取的数据就是脏的。举例:订单A需要商品A20件,订单B需要商品A10件。仓库中有商品A库存是20件。订单B先查询,发现库存够,进行扣减。在扣减的过程中,订单A进行查询,发现库存只有10个不够订单数量,抛出异常。这时候订单B提交失败了。库存数量又变成20了。这时候,仓库人员去查库存,发现数量是20,可是订单A却说库存不足,这就让人很奇怪。
2.不可重复读
复读指的是在一个事务内,最开始读到的数据和事务结束前的任意时刻读到的同一批数据出现不一致的情况。举例:库房管理员查询商品A的数量,读取结果是20件。这是订单A出库,扣减了商品10件。这时管理员再去查商品A时,发现商品A的数量时10件和第一此查询的结果不同了。
3.幻读
事务A在执行读取操作,需要两次统计数据的总量,前一次查询数据总量后,此时事务B执行了新增数据的操作并提交后,这个时候事务A读取的数据总量和之前统计的不一样,就像产生了幻觉一样,平白无故的多了几条数据,成为幻读。举例:操作员查询可生产单量10个,调用接口下发10个订单,事务A增加10个订单。操作员获取10个订单落库,查询发现变成30个订单。
5事务隔离级别
ReadUn