Mysql锁类型:
一、普通锁、读锁(共享锁)、写锁(排他锁);
1、普通锁
串行、互斥
2、读锁
先加读锁后,可以与其他读锁共存
3、写锁
先加写锁,不能与其他锁共存
redo/undo日志
在开始事务前会先保存一份undo日志,这份日志可以用于其他线程读取,也可用于新事务失败后回滚。
insert操作,undo日志记录新数据的PK,直接删除,
update/delete操作,undo日志记录旧数据row,回滚直接恢复。
redo是当前事务的操作数据,将整个事务的数据放入日志中,然后在事务提交后再输入磁盘,可实现数据分批次统一处理,随机读写优化为顺序读写。
多版本 MVVC,为了提高并发,于是采用MVVC的方式,通过多版本数据实现数据读写并发;读取的数据就是事务开始前的undo日志。
多版本快照读就是使用MVVC机制,
RC 总能读取到最新数据(自己或其他事务已经提交的)
RR 只能读取事务中第一次读取时读取的数据
INNODB 会对row新增3个属性,
1、DB_TRX_ID 6字节,记录最后一次修改它的事务ID,
2、DB_ROLL_PTR,7字节,记录回滚段undo日志的指针地址,
3、DB_ROW_ID,6字节,自增长ID。
二、表锁、行锁、区域(间隙)锁;
表锁是锁整张表,
1、自增长会产生自增长锁,是一种表锁,它会阻塞其他事务的插入操作
2、优化1的情况,就出现了插入意向锁,是间隙锁的一种,只要插入位置不冲突,就不会阻塞
行锁是锁某一行记录,INNODB支持行锁,实现是锁住行的索引;所以如果操作没有命中索引,也就不会使用行锁,而是使用表锁。
区域(间隙)锁,防止其他事务在间隔中(索引间隔)插入数据,导致不可重复读,所以RC不会有该锁。