MySQL READ_COMMITTED隔离级别下增量更新的执行策略与结果咨询
问题解答
最终执行结果与采用策略
最终count字段的值为3,MySQL采用的是第二种无竞态条件的策略。
UPDATE语句属于MySQL的当前读操作,执行时会先为命中的行加排他行锁,锁获取成功后才会读取行的当前值、做增量计算、写入新值,锁会一直持有到事务提交才释放。整个过程不会出现两个事务同时读取到相同初始值的情况,也就不会产生第一种策略里的更新覆盖问题。
注意:第一种存在竞态的场景仅会出现在「先在业务代码中单独SELECT读取count值、计算后再执行UPDATE」的写法中,和本问题中单条UPDATE内置增量计算的逻辑完全不同。
READ_COMMITTED隔离级别的相关保证
- 杜绝脏读:事务所有读取到的数据都是其他事务已提交的修改结果,不会读取到其他事务未提交的中间状态值。
- 加锁读的最新值保证:UPDATE、SELECT ... FOR UPDATE这类加锁的当前读操作,每次都会读取行的最新已提交版本,保证修改是基于最新的有效值进行。
- 行锁隔离:加锁后的行在锁释放前,其他事务无法对其进行修改或加锁,避免了并行修改同一条数据的冲突问题。
内容的提问来源于stack exchange,提问作者Jon Bates
相关产品推荐
相关产品推荐

