for update 与 lock in share model 两者区别:
for update用于给符合条件的rows加上IX(意向排它锁),加锁后,其他事物不能读取或修改当前被锁定的rows,但innodb存在一致性非锁定的读,所以能读取对应的快照读,所以不会阻塞其他事务对锁定rows的快照度;
lock in share model用于给符合条件的rows加上IS(意向共享锁)。加锁后,其他事物能读取对应的rows,也能给对应的rows加IS锁,但是无法修改当前锁定的rows,直到锁定的session已经提交;
InnoDB中MVCC是通过两个隐藏列来实现的,用于保存行的创建时间和过期时间(删除时间);这里所谓的时间不是实际的时间值,而是系统版本号(system version number)。当session开启时,系统版本号都会自动递增,作为当前session的版本号,用来和查询到到每行记录到版本做比较。
在可重复度隔离级别下,MVCC操作如下:
MCVV只在读已提交和可重复度隔离级别下工作,因为读未提交下总是读取到最新到数据,不满足当前事务版本的数据行,而串行化会给每一读取到的行加锁。