锁与并发

  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不会有该锁。

    

猜你喜欢

转载自www.cnblogs.com/souyoulang/p/9765187.html