mysql 隔离级别以及并发处理事务造成的问题
一、事务具有ACID四个属性
1. 原子性:事务的处理具有原子性,即全部提交或者全部不提交。原子性关注状态,要么全部成功,要么全部失败,不存在部分成功的状态
2. 一致性:事务开始和完成的时候数据必须保持一致性。一致性关注数据的可见性,中间状态的数据对外部不可见,只有最初状态和最终状态的数据对外可见
3. 隔离性:是指事务在并发操作的时候事务之间互相不干扰,
4. 持久性:事务的修改是永久性的,即使出现系统故障也能够保持
二、事务的隔离级别
隔离级别
|
读数据一致性
|
脏读
|
不可重复读
|
幻读
|
未提交读(Read uncommitted)
|
最低级别,只能保证不读取物理上损坏的数据
|
是
|
是
|
是
|
已提交读(Read committed)
|
语句级
|
否
|
是
|
是
|
可重复读(Repeatable read)
|
事务级
|
否
|
否
|
是
|
串行化(Serializable)
|
最高级别,事务级
|
否
|
否
|
否
|
三、并发处理事务可能造成的问题
1. 脏读: 读到了别的事务回滚前的脏数据。比如事务B执行过程中修改了数据X,在未提交前,事务A读取了X,而事务B却回滚了,这样事务A就形成了脏读。
2. 幻读:在一个事务中,两次查询得到满足条件的数据条数不一致。事务A首先根据条件索引得到N条数据,然后事务B改变了这N条数据之外的M条或者增添了M条符合事务A搜索条件的数据,导致事务A再次搜索发现有N+M条数据了,就产生了幻读。---幻读主要针对update或delete
3. 不可重复读:在一个事务中,两次查询得到的数据不一致。事务A首先读取了一条数据,然后执行逻辑的时候,事务B将这条数据改变了,然后事务A再次读取的时候,发现数据不匹配了,就是所谓的不可重复读了。---不可重复读主要针对insert