数据库的事务隔离级别其实是“可用性”和“数据一致性”的一场博弈——隔离级别的程度越高,数据一致性做的越好,但可用性在降低。
这里的“数据一致性”是指:在一个事务中,同一条sql查询语句,多次读取,所得数据没有变化(
没有受到其他事务的干扰
)。
下面我们用图示的方式来描述不同的事务隔离级别可能出现的“数据一致性”问题:
我们用一条水平线来代表时间轴,用两个长矩形来分别代表两个事务,其中矩形在时间轴上重叠的部分则代表其并行特征(当然,在实际使用中未必只有并行的两个事务,但两个事务足以说明问题)。
两个只读事务,不存在数据不一致的问题,不存在探讨价值;同样,两个只写事务,不存在对数据的使用过程,也不存在数据不一致的问题。
脏读与不可重复读
如上图,事务一将‘张三’的总额在原来的基础上增加10,事务二在事务一提交前后分别查询了一次‘张三’的总额;那下面用图示的方式解释会出现什么问题。
幻读
如上图,事务二中是不可能出现update和delete操作的,因为不可重复读的隔离级别会对事务一第一次读取到的数据加行锁,所有事务一时间范围内事务二的update和delete操作会处于锁等待状态,直到事务一执行完毕(当然,有可能因锁超时而被数据库放弃执行)。
如上图,事务一的两次读取结果也不同,实时上也是一种“不可重复读”,但与上文中提到的不可重复读有区别的地方在于--两次读取到的数据集合不再是同样的数据行记录;所以,习惯上称这种现象叫--幻读。