脏读
当一个事务正在访问数据并且对数据进行了修改,而且这种修改还没有提交到数据库中,这个时候另外一个事务也访问了这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据, 那么另外一个事务读到的这个数据是“脏数据”,依据“脏数据”所做的操作是不正确的。
步骤 | 事务A | 事务B |
---|---|---|
1 | 开启事务A | |
2 | 开启事务B | |
3 | 查询余额为100 | |
4 | 余额增加至150 | |
5 | 查询余额为150 | |
6 | 事务回滚 |
不可重复读
指在一个事务内多次读同一数据。这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读区的数据可能不太一样。这样就发生了在一个事务内两次读到的数据时
不一样的情况,因此称为不可重复读。
步骤 | 事务A | 事务B |
---|---|---|
1 | 开启事务A | |
2 | 开启事务B | |
3 | 查询余额为100 | |
4 | 余额增加至150 | |
5 | 查询余额为100 | |
6 | 提交事务 | |
7 | 查询余额为150 |
幻读
和不可重复读类似,它发生在一个事务A读取了几行数据,接着另一个并发事务插入了一些数据,在随后的查询中。第一个事务会发现多了一些原本不存在的记录。
步骤 | 事务A | 事务B |
---|---|---|
1 | 开启事务A | |
2 | 开启事务B | |
3 | 查询id>3的所有记录共3条 | |
4 | 插入一条记录id=4 | |
5 | 提交事务 | |
6 | 查询id>3的所有记录共4条 |
评论区