当一个事务对数据进行了修改,但是未提交,这时另外一个事务读取到这个数据,称之为脏读。
脏数据:未提交的数据。
脏读:一个事务读到另一个事务的未提交数据。
时间点 | 事务A | 事务B |
---|---|---|
1 | 开启事务A | |
2 | 开启事务B | |
3 | 查询余额为100 | |
4 | 余额增加至150(未提交) | |
5 | 查询余额为150 | |
6 | 事务回滚 |
不可重复读是指在一个事务内多次读取同一数据集合。在这个事务还没有结束时,另一个事务也访问了该同一数据集合,并做了一些DML操作。那么第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样,如果读到不一样的数据,由于这个不一样的数据是已提交的数据,导致不可重复读原始数据,所以称为不可重复读。
不可重复读:一个事务读到另一个事务已提交的数据导致不可重复读原始数据。
时间点 | 事务A | 事务B |
---|---|---|
1 | 开启事务A | |
2 | 开启事务B | |
3 | 查询余额为100 | |
4 | 余额增加至150(未提交) | |
5 | 查询余额为100 | |
6 | 提交事务 | |
7 | 查询余额为150 |
幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事物(T1)就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称之为幻读。
时间点 | 事务A | 事务B |
---|---|---|
1 | 开启事务A | |
2 | 开启事务B | |
3 | 查询id<3的所有记录,共3条 | |
4 | 插入一条记录id=2 | |
5 | 提交事务 | |
6 | ||
7 | 查询id<3的所有记录,共4条 |
脏读和不可重复读的区别:
脏读读的是未提交数据,不可重复读读的是已提交数据。
不可重复读和幻读的区别:
不可重复读的重点是修改(UPDATE)数据,幻读的重点在于新增(INSERT)或者删除(DELETE)记录。
解决不可重复读的问题只需要锁住满足条件的行,解决幻读需要锁表。