脏读,不可重复读,幻读及事务隔离等级
Posted xyz0835
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了脏读,不可重复读,幻读及事务隔离等级相关的知识,希望对你有一定的参考价值。
脏读,不可重复读,幻读及事务隔离等级
概念 | 现象 | 出现条件 | 解决办法 |
---|---|---|---|
脏读 | 读取到了别的事务未提交的数据,而读取到的数据可能会回滚,所以得到的数据可能是假数据,故称为脏读 | 隔离等级为Uncommitted | 将隔离等级改为Committed |
不可重复读 | 事务中两次查询结果不一致。原因:A事务的两次查询过程中,B事务修改/删除并提交了新的数据 | 隔离等级为Committed及以下 | 将隔离等级改为Repeatable |
幻读 | 事务中两次查询结果条数不一致。原因:A事务的两次查询过程中,B事务新增并提交了符合A事务查询条件的数据 | 隔离等级为Repeatable及以下 | 将隔离等级改为Serializable |
事务级别 | 特点/实现方式 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|---|
Uncommitted | 可以读取别的事务没有提交而可能回滚的数据,造成脏读。 | √ | √ | √ |
Committed | 只能读取其他事务已提交的数据。如果有其他未完成的事务,则不能获得查询结果。必须等待所有事务都结束,才能返回查询结果。避免了脏读。 但是A事务已查询出来的数据,可以被B事务能修改/删除,造成了A事务两次相同语句查询出来的结果不一致,即不可重复读。也会造成幻读 |
× | √ | √ |
Repeatable | A事务的查询过程中(A事务未结束),B事务不能更新或删除A事务中读取出来的数据,必须等待A事务结束后才能进行。避免了不可重复读。 但是B事务可以新增符合A事务查询条件的数据。从而会造成幻读。即A事务在B事务新增前后查询出来的结果数目不同。 |
× | × | √ |
Serializable | A事务查询过程中(A事务未结束),B事务至少不能新增/修改/删除符合A查询条件内的任何数据,必须等待A事务结束。也有可能不能增/删/改A事务查询条件外的数据。 是最强隔离等级。 |
× | × | × |
以上是关于脏读,不可重复读,幻读及事务隔离等级的主要内容,如果未能解决你的问题,请参考以下文章
什么是脏读不可重复读幻读?一文带你搞定MySQL事务隔离级别