写在前面:博主是一只经过实战开发历练后投身培训事业的“小山猪”,昵称取自动画片《狮子王》中的“彭彭”,总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域,如今终有小成,愿将昔日所获与大家交流一二,希望对学习路上的你有所助益。同时,博主也想通过此次尝试打造一个完善的技术图书馆,任何与文章技术点有关的异常、错误、注意事项均会在末尾列出,欢迎大家通过各种方式提供素材。
- 对于文章中出现的任何错误请大家批评指出,一定及时修改。
- 有任何想要讨论和学习的问题可联系我:zhuyc@vip.163.com。
- 发布文章的风格因专栏而异,均自成体系,不足之处请大家指正。
数据库并发与并发异常
本文关键字:脏读、脏写、更新丢失、不可重复读、幻读
在使用数据库来支撑业务系统时,随着用户量的增大,经常会遇到同时读取相同数据的情况,在没有进行并发控制的情况下就会遇到各种各样的问题,对于可能出现的问题我们要有所了解。
一、什么是并发
并发指的是在同一时间,有多个程序都处在启动运行到运行完毕之间的状态,并且都在同一个处理机上运行。
对于数据库来说,数据库并发指的就是在同一时间内,有多个事务都处在开始到提交之间的状态,并都在同一个数据库服务中。
二、常见并发异常
有关于事务的特性可参考前一篇文章:数据库事务与特性。假设不做任何的并发控制,让那些对数据的操作自由执行,将会遇到下列的问题:
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。
扫描下方二维码,加入官方粉丝微信群,可以与我直接交流,还有更多福利哦~