MySQL 并发事务

本文详细介绍了数据库事务的ACID特性,包括原子性、一致性、隔离性和持久性,并探讨了并发事务可能导致的问题,如更新丢失、脏读、不可重复读和幻读。接着,解释了不同隔离级别(读未提交、读已提交、可重复读、可串行化)及其对这些问题的解决策略。重点讨论了MVCC在不同隔离级别中的作用以及锁的使用。最后,给出了理解事务隔离级别实现原理的相关资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 事务的ACID特性

原子性。事务的全部操作要么全部执行成功,要么全部失败。

一致性。事务开始及结束时,数据都保持一致性(正确的)状态。例如,微信转账不可以一边扣款,另一边无变化。

隔离性。数据库提供一定的隔离机制保证事务不受其他事务的影响。即事务的操作对外部是不可见的。

持久性。事务提交之后,对数据库的影响是永久的。

2 并发事务带来的问题

①更新丢失。两个事务同时对一个数据进行修改,原数据是100,A进行减90,B减20。A和B各自的操作是读数据,之后减数据,写回。可能的情况是:A、B读数据100;A - 90,写回数据变为10;之后B - 20,写回数据变为80。A修改的数据就丢失了。

②脏读。例如,微信购物。把微信购物做成一个事务:销售方先对库存减去购物的数量,之后再由用户去付款,如果用户的金额低于需要销售的金额就回滚。共有120件商品,A进购100件商品,之后B去买50件,发现低于不买。但A发现自己没那么多钱,于是也放弃购买。这就是脏读。B读取到了事务A未提交的数据。

③不可重复度。一次事务前后读取到的数据不一样。

脏读和不可重复读的区别:脏读读的是未提交的数据。不可重复读读的是已提交的数据。

④幻读。一次事务中查询时该位置没有数据(或有数据),但在插入时却发现有数据(删除/修改时没有数据)。

不可重复读和幻读的区别:不可重复读指的是一次事务前后相同条件读取数据不一致。幻读指的是前面读取数据是没有的(或有的),但在增加(修改/删除)时发现数据是有的(没有的)。本质是,不可重复读两次都为读;幻读是第一次读,第二次对数据操作发现和读取的不符合(像做梦一样,所以叫幻读)。

3 并发事务的隔离级别

①读未提交。无需任何手段。

②读已提交。可以避免脏读。

快照读:MVCC处理(每次进行快照读时生成新的readview,因此有不可重复读问题)
当前读:RC隔离级别保证对读取到的记录加锁(记录锁),存在幻读。

③可重复读。Mysql默认隔离级别。避免脏读和不可重复读。

快照读:MVCC处理(只有第一次进行快照读时才会生成readview,之后的读操作都会使用第一次生成的readview)
当前读:RR隔离级别保证对读取到的记录加锁(记录锁),同时保证对读取的范围加锁(间隙锁),使新的满足查询条件的记录不能够插入 ,不存在幻读现象

④可串行化。可以避免脏读、不可重复读和幻读。

相关资料:(1条消息) 从因到果看懂事务隔离级别的实现原理_:“来都让一让”的博客-CSDN博客_事务隔离级别的实现原理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值