数据库事务并发问题。如何理解脏读、不可重复读、幻读。

小熊博客
2021-08-02 / 1 评论 / 318 阅读
温馨提示:
本文最后更新于2021-08-02,若内容或图片失效,请留言反馈。

脏读

当一个事务正在访问数据并且对数据进行了修改,而且这种修改还没有提交到数据库中,这个时候另外一个事务也访问了这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据, 那么另外一个事务读到的这个数据是“脏数据”,依据“脏数据”所做的操作是不正确的。

步骤事务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条