基本类型
主要介绍mysql 的锁的主要类型,主要包括全局锁,表锁,行锁(这里还会涉及到间隙锁),目的是为了在开发工作中能给与帮助
全局部锁
这是一个会把整个mysql 库锁住的锁,对整个库进行独占式访问,目前基本不使用,只有在不支持的事务的引擎时可能会用到,比如用来作数据同步
缺点就是在并发性能很差,一旦开启整个库会被当前资源独占
在支持事务的引擎中,可以通过--single-transaction来完成,示例: mysqldump --single-transaction -u username -p mydatabase > mydatabase_dump.sql
表锁
主要目的是解决对同一个数据表进行并发访问时的数据安全问题
主要分为两种:共享锁(shared lack)和排他锁(exclusive lock)
1、共享锁
多个会话可以同时持有进行读操作,但不能进行写操作,适用于并发读操作
使用示例:LOCK TABLES table_name READ;
2、排他锁
只有一个会话能够获取到排他锁,对数据表进行写操作,访问数据同时被其他会话进行修改,保证数据一致性,完整性
使用示例: LOCK TABLES table_name WRITE;
行锁
1. 行锁的类型
行锁主要分为两种类型:
共享锁(S Lock):允许多个事务同时读取同一行数据,但阻止其他事务对该行进行写操作。
排他锁(X Lock):阻止其他事务对该行进行读或写操作,确保当前事务对该行的独占访问。
2. 行锁的获取和释放
获取锁:当一个事务需要读取或修改某一行数据时,会请求相应的锁。
释放锁:当事务提交或回滚时,会自动释放所有获取的锁。
3. 行锁的工作原理
索引锁定:InnoDB 存储引擎通过索引来实现行锁。当事务请求对某一行进行操作时,InnoDB 会锁定该行的索引记录。
间隙锁定:除了锁定具体的行,InnoDB 还可以锁定索引之间的间隙(Gap Lock),以防止其他事务在这些间隙中插入新行。
Next-Key 锁:Next-Key 锁是行锁和间隙锁的组合,它不仅锁定索引记录,还锁定索引记录之前的间隙。
4、间隙锁(Gap Lock)
MySQL 的间隙锁(Gap Lock)是 InnoDB 存储引擎中的一种锁定机制,用于防止其他事务在特定范围内的间隙中插入新行。间隙锁与行锁和记录锁结合使用,可以提供更细粒度的并发控制,尤其是在高并发环境下。以下是对 MySQL 间隙锁的详细解释:
- 间隙锁的定义
间隙:索引中的两个连续记录之间的范围,包括索引的开头和结尾。
间隙锁:锁定索引中的间隙,防止其他事务在这些间隙中插入新行。 - 间隙锁的作用
防止幻读:在可重复读(Repeatable Read)隔离级别下,间隙锁可以防止其他事务在当前事务的查询结果集中插入新行,从而避免幻读现象。
提高并发性能:通过锁定间隙,可以减少不必要的锁竞争,提高并发性能。 - 间隙锁的工作原理
索引锁定:InnoDB 存储引擎通过索引来实现间隙锁。当事务请求对某个范围内的数据进行操作时,InnoDB 会锁定该范围内的间隙。
Next-Key 锁:Next-Key 锁是行锁和间隙锁的组合,它不仅锁定索引记录,还锁定索引记录之前的间隙。 - 间隙锁的示例
假设有一个表 users,其 id 列是主键,并且有以下数据:
id | name
1 | Alice
3 | Bob
5 | Charlie
假设事务 A 执行以下查询:
SELECT * FROM users WHERE id > 1 AND id < 5 FOR UPDATE;
在这个查询中,InnoDB 会锁定以下间隙:
(1, 3)
(3, 5)
这意味着其他事务不能在这些间隙中插入新行,例如插入 id 为 2 或 4 的记录。
5. 间隙锁的注意事项
死锁:在高并发环境下,多个事务同时请求不同范围的间隙锁时,可能会发生死锁。MySQL 会自动检测并处理死锁,但应尽量避免复杂的事务逻辑。
隔离级别:不同的事务隔离级别会影响间隙锁的行为。例如,在可重复读(Repeatable Read)隔离级别下,InnoDB 会使用 Next-Key 锁。
性能影响:间隙锁可以提高并发性能,但也可能导致更多的锁竞争,特别是在数据密集的索引中。