多个事务对数据库的并发操作带来的数据不一致性包括脏读、不可重复读、幻读。
一、脏读
脏读是指事务1修改某一个数据并将其写回磁盘,事务2读取了这个被修改后的数据,但是事务1由于某些原因被撤销了,这时被事务1修改的数据就会恢复到原值,造成事务2读到的数据与数据库中的数据不一致,那么事务2读到的就是脏数据。
事务1 | 事务2 |
---|---|
开启事务 | |
账户余额为1000 | 开启事务 |
存入1000,余额增加为2000 | … |
… | 查询账户余额为2000 |
发生故障,事务回滚,账户余额恢复到1000 | 提交 |
提交 |
事务2中读到的余额为2000,与数据库中的余额1000不一致。
二、不可重复读
不可重复读是指事务1读取数据后,事务2执行了更新操作,使事务1无法再得到与第一次一样的结果。
事务1 | 事务2 |
---|---|
开启事务 | |
账户余额为1000 | 开启事务 |
… | 转入1000 |
… | 提交 |
再次查询余额为2000 | |
提交 |
在事务1中第一次查询余额为1000,第二查询为2000,两次读取结果不一致。
三、幻读
幻读是指事务1在读取某个范围内的数据后,事务2又在该范围内插入了新的数据或者删除了已有的数据,再次查询该范围发现数据总量上的不一致,就像产生了幻觉一样,无端多出或少了几条数据。
事务1 | 事务2 |
---|---|
开启事务 | |
查询student表,得到99条数据 | 开启事务 |
… | 来了1个插班生或转走1个学生 |
… | 提交 |
再次查询student表,得到100或98条数据 | |
提交 |
四、特点
脏读:读其他事务还未提交的数据。
不可重复读:前后几次读取,数据总量相同,内容不同,针对update操作。
幻读:前后几次读取,数据总量不相同,针对insert、delete操作。