MySql概述

并发控制:
通过读写锁实现;提高共享资源并发性的方式:锁的粒度(不同的锁策略)
MySQL锁策略:
表锁 & 行锁


死锁:
InnoDB将持有最少排他锁的事务回滚

不同表使用合适的存储引擎很重要


MVCC多版本并发控制
行级锁的一个变种;开销更低;各种存储引擎的实现机制不同,但大都实现了非阻塞的读操作,写操作只锁定必要行;

MVCC通过保存数据在某个时间点的快照实现;

InnoDB的MVCC实现:
通过在每行记录后面增加两个隐藏的列实现:一个行的创建时间;一个行的过期时间;(实际上不是时间而是版本号)

InnoDB Repeatable Read隔离级别下MVCC的具体操作如下:
Select:InnoDB根据下面两个条件检查每行记录:

  1. 只查找版本早于当前事务版本的数据行(也就是,行的系统版本号小于或等于事务的系统版本号),这样可以确保事务读取的行,要么在事务开始前已经存在,要么是事务自身插入或者修改过的;
  2. 行的删除版本要么未定义,要么大于当前事务版本号;这可以确保事务读取到的行,在事务开始之前未被删除;
    Insert:InnoDB未插入的每行保存当前系统版本号作为行版本号;
    Delete:InnoDB为删除的每行保存当前系统版本号作为行删除标识;
    Update:InnoDB为插入一行新记录,保存当前系统版本号作为行版本号,同时保存当前系统版本号到原来的行作为删除标识;
    保存这两个额外的系统版本号,使得大多数读操作都不用加锁,这样使得读操作很简单,性能很好,且能保证只读到符合标准的行;不足是每行记录都需要额外的存储空间,需要更多的行检查和维护;
    MVCC只在Repeatable Read和Read Commited两个隔离级别下工作,其他两个都和MVCC不兼容;(Read Uncommitted总是读取最新行,Serializable对所有行都加锁)

间隙锁(Next-Key Locking)防止幻读;(不仅仅锁定查询涉及的行,还会对索引中的间隙进行锁定,防止幻影行的插入)

相信技术的力量,原创技术文章,感谢您的支持!