本文关键字: 脏读, 脏写, 更新丢失, 不可重复读, 幻读
在使用数据库来支撑业务系统时, 随着用户量的增大, 经常会遇到同时读取相同数据的情况, 在没有进行并发控制的情况下就会遇到各种各样的问题, 对于可能出现的问题我们要有所了解.
一, 什么是并发
并发指的是在同一时间, 有多个程序都处在启动运行到运行完毕之间的状态, 并且都在同一个处理机上运行.
对于数据库来说, 数据库并发指的就是在同一时间内, 有多个事务都处在开始到提交之间的状态, 并都在同一个数据库服务中.
二, 常见并发异常
假设不做任何的并发控制, 让那些对数据的操作自由执行, 将会遇到下列的问题:
1. 脏读
脏读指的是一个事务 A 在运行时读取了另一个失败事务 B 未提交的数据, 这就导致事务 B 回滚后, 事务 A 读取到了一个与数据库记录冲突的错误数据.
数据库中某条数据的 money 值为 20, 在处理过程中, 事务 B 修改值为 100, 随后被事务 A 读取, 接下来事务 B 因为其他环节的错误导致回滚, money 的值被还原为 20, 这时事务 A 所读取的数据即为脏数据 (错误数据).
2. 脏写
脏写指的是一个事务 A 一同回滚了另外一个事务 B 已经提交的数据, 这将导致事务 B 已经执行成功的操作一同被回滚.
事务 B 先于事务 A 执行成功, 但随后事务 A 回滚, 将事务 B 的提交内容一同回滚.
3. 更新丢失
更新丢失指的是事务 A 与事务 B 均提交成功, 但是由于读取和写入的时间点问题, 导致事务 B 的修改结果好像未生效一样.
最初数据库中 money 的值为 20, 在事务 B 提交成功后 money 的值为 40, 按正常逻辑事务 A 将 money 的值减去 20, 结果应为 20, 但对事务 A 来说读取到的值为 20, 导致最后结果为 0.
4. 不可重复读
不可重复读指的是由于另外一个事务 B 对数据的操作, 导致事务 A 前后两次读取到的结果不一致. 与脏读的主要区别是: 一个读取的是已经被回滚的数据, 一个读取的是已经成功提交后的数据, 但前后并不一致.
5. 幻读
幻读指的是读取某个范围的数据时, 因为有其他事务的操作导致前后两次的查询结果不同. 不可重复读与幻读的主要区别在于不可重复读是一条具体数据的不一致, 幻读是对一组数据的前后不一致.
在事务 B 执行前, 事务 A 得到的结果集为: 1,3,4,7, 在事务 B 插入一个新的账户: 8 后, 事务 A 得到的结果集为: 1,3,4,7,8.
来源: http://www.bubuko.com/infodetail-3650359.html