MySQL事务并发问题

wxvirus2021年11月28日
大约 2 分钟

脏读(Dirty read)

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

时间点事务 A事务 B
1开启事务 A
2开启事务 B
3查询余额为 100
4余额增加至 150(尚未提交)
5查询余额为 150(脏数据)
6事务回滚

不可重复读(Unrepeatableread)

指在一个事务内多次读取同一数据。在这个事务还未结束时,另一个事务也访问该数据,那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的。因此成为不可重复读。

时间点事务 A事务 B
1开启事务 A
2开启事务 B
3查询余额为 100
4余额增加至 150
5查询余额为 100
6提交事务
7查询余额为 150

体现在数据的修改,锁住一行记录即可

幻读(Phantom read)

幻读与不可重复度类似,它发生在一个事务(T1)读取了几行数据,接着另外一个并发事务(T2)插入了一些数据时,在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录,就像发生了幻觉一样,所以称之为幻读

时间点事务 A事务 B
1开启事务 A
2开启事务 B
3查询 id<3 的所有记录,共 3 条
4插入一条记录 id=2
5提交事务
6查询 id<3 的所有记录,共 4 条

体现在新增和删除,得锁住整张表

Loading...