对于脏读、不可重复读、幻读的一点理解

事务4个隔离界别

read uncommintted 读未提交
read commited 读提交
repeatable read 可重复读
serializable 可序列化

read uncommitted 最低级的隔离级别

最直接的效果就是一个事务可以读取另一个事务并未提交的更新结果

read committed 通常是大部分数据库采用的默认隔离级别,它在read uncommitted 隔离级别基础上所做的限定更进一步,在该隔离级别下,一个事务的更新操作结果只有在该事务 提交之后,另一事务才可能读取到同一笔数据更新后的结果
所以read committed可以避免read uncommitted 隔离级别下存在的脏读问题,但是无法避免不可重复读和幻读的问题

repeatable read 隔离级别可以保证在整个事务的过程中,对同一笔数据的读取结果是相同的,不管其他事务是否同时在对同一笔数据进行更新,也不管其他事务对同一笔 的更新提交与否。repeatable read 隔离级别避免了脏读和不可重复读取的问题,但是无法避免幻读(mysql默认隔离级别)

serializable 最为严格的隔离级别,所有的事务操作都必须依次顺序执行,可以 避免其他隔离级别所遇到的问题,是最为安全的隔离级别,但是同时也是性能最差的隔离级别。
因为所有的事务在该隔离级别下都需要依次顺序执行,所以并发度下降,吞吐量上不去,性能自然也就下来了。因为该隔离1级别极大的影响系统性能,所以很少场景去使用它。
通常情况下,我们会使用其他隔离级别加上相应的并发所锁来控制对数据的访问,这样既可以保证了系统性能不会损失太大,也能一定程度上保证数据的一致性

并发问题

脏读

针对未提交数据)如果一个事务中对数据进行了更新,但是事务没提交,另一个事务可以看到该事务没有提交的更新结果,这样造成的问题就是,如果第一个事务回滚,那么第二个事务在此之前所看到的数据就是一笔1脏数据。

不可重复读

针对其他提交前后,读取数据本身的对比)不可重复读是指同一个事务在整个事务过程中对同一笔数据进行读取,每次读取的结果都不同。如果事务1在事务2的更新操作之前读取一次数据,
在事务2的更新操作之后再读取同一笔数据一次,两次结果是不同的,所以read uncommitted 也无法避免不可重复读取的问题

幻读

针对其他提交前后,读取数据跳的对比)幻读是指同一样一笔查询在整个事务过程中多次执行后,查询所得到的结果集是不一样的。幻读针对的是多笔记录。
在read uncommitted 隔离级别下,不管事务2的插入操作是否提交,事务1在插入操作之前和之后执行相同的查询,取得的结果集是不同的,所以,read uncommitted同样无法避免幻读的问题

不可重复读和幻读区别:

不可重复读的重点是修改:同样的条件,你读取过的数据,再次读取出来发现数值不一样了。
在一个事务中前后两次读取的结果不一致,导致了不可重复读

幻读

幻读的重点在于新增或者删除(数据条数变化)
同样的条件,第一次和第二次读出来的记录是不一样的。

猜你喜欢

转载自www.cnblogs.com/liushiya/p/12822030.html
今日推荐