MySQL事务并发问题
2021年11月28日
脏读(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...