你在项目中用到事务了吗,如果你对表中的数据进行了两次操作,
1 更新表中的数据 成功
2 删除表中的数据 失败
那么请问 你更新能成功吗。
菜鸡本菜的回答:事务的原子性 导致不会成功。
大佬说(非面试官):这个应该是面试官要问你间隙锁。 通过版本号来标记,不存在删除数据的操作,只是版本号无效。
理论:
MVCC和间隙锁
多版本并发控制(Multi-VersionConcurrency Control,Mvcc)是mysql的InnoDb存储引擎实现隔离级别的一种具体的方式,
用于实现读已提交和可重复读这两种隔离级别。读未提交总是读取最新的数据行,无需使用MVCC。可串行化隔离级别需要
对所有的行都加锁,仅仅依赖MVCC是无法实现的。
MVCC可以认为是行级锁的一个变种,但是他在很多情况下都避免了加锁操作,因此开销更低。
InnoDb的版本号是乐观并发控制,每行数据存在一个版本号,每次更新数据都更新该版本号,修改时copy出当前版本。随意修改,各个
事务之间互不干扰,保存时比较版本号,如果版本号一致则commit,不一致就rollback。MVCC在每行记录后面都隐藏着两个列,用来存储
两个版本号,创建版本号和删除版本号。
查询(select):InnoDb只会查找系统版本号小于或者等于当前事务的版本号并且删除版本号未定义或者大于当前事务的版本号的行,这样可以确保读取的
行要么是在事物开始前就已经存在的,要么是事务本身插入修改的,且在事务开始前未被删除。
更新(update):将当前系统的版本号当做数据行的删除版本还,并且将当前系统版本号作为修改后数据行的创建版本号(拗口)
MVCC不能解决幻读问题,在可重复读的隔离级别下,使用MVCC+Next-Key Locks可以解决幻读的问题。
Next-KeyLocks是InnoDB行锁和间隙锁的默认组合。间隙锁是在锁定索引记录见习,确保索引记录的间隙不变。
Next-KeyLocks当对数据进行条件范围检索的时候,对其范围内存在的值进行加锁,防止其他事务的插入操作来达到防止幻影读的目的。
原文地址:https://www.cnblogs.com/bowenqianngzhibushiwo/p/11651348.html