🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 锁 锁机制可以用于控制并管理对并发资源的访问。数据库系统中使用锁是为了支持对共享资源进行并发访问,并保证数据的完整性和一致性。 **Mysql中的锁策略** 锁策略:寻求一种在锁开销(加锁,解锁,争夺锁)和数据安全性维持平衡的一种策略。锁策略属于`存储引擎层`,不同的存储引擎可以支持不同的锁策略。 1. 表锁 table lock 表锁是mysql中最基本也是开销最小的策略,当有写者线程(进行插入,删除,修改操作)的时候锁定整张表,其他读线程和写线程都不能操作这张表,阻塞等待。读锁之间不阻塞。-- `写者优先`。 虽然不同的存储引擎可以实现不同的锁策略,例如有些存储引擎只支持行锁,但是mysql服务器仍然会对一些语句例如Alter table使用表锁,而忽略存储引擎的锁机制。 表锁是一种非常粗糙的锁机制,严重影响系统的`吞吐量`。 MYISAM存储引擎实现的就是表锁。 2. 行级锁 row lock 可以最大程度的支持并发处理,同时也带来了最大的锁开销。Innodb实现了行级锁,在InnoDB中实现了两种标准的行级锁: * S Lock共享锁:允许事务读一行数据。 * X Lock排他锁:允许事务删除或更新一行数据。 ![](https://img.kancloud.cn/1e/a4/1ea424f7137c871c33dcbc131d46ff6d_823x145.png) ~~~  这里的兼容性指的是对于同一行记录而言,对于不同行记录之间不会有影响。 ~~~ 3. 意向锁 Intention Lock:将锁定的对象分为多个层次,意向锁意味着事务希望在更细粒度上进行加锁。 * 意向共享锁 IS Lock:事务想要获得某几行的共享锁。 * 意向排他锁 IX Lock:事务想要获得某几行的排他锁。   ## 一致性非锁定读 Consistent Nonlocking Read,通过多版本并发控制(MVCC)的方式读取当前执行时间数据库中的行的数据,如果读取的行在执行delete或者update操作,`不需要等到锁的释放`再去读取,而是直接读取行的快照数据。 通过undo段实现的非锁定读机制可以极大的提高并发性,是InnoDB的默认行为,但是并不是所有的隔离级别都会采用。 * Read Committed:会读取最新的快照数据。 * Repeatable Read:读取事务开始时的快照数据。   ## 锁的算法 行锁的三种算法: 1. Record Lock:单个记录上锁 2. Gap Lock:间隙锁:锁定一个范围,不包含记录本身 3. Next-Key Lock:记录锁+间隙锁,锁定一个范围,并且包含记录本身。