searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Mysql 锁机制分析

2024-11-29 09:11:18
0
0

基本类型

主要介绍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 间隙锁的详细解释:

  1. 间隙锁的定义
    间隙:索引中的两个连续记录之间的范围,包括索引的开头和结尾。
    间隙锁:锁定索引中的间隙,防止其他事务在这些间隙中插入新行。
  2. 间隙锁的作用
    防止幻读:在可重复读(Repeatable Read)隔离级别下,间隙锁可以防止其他事务在当前事务的查询结果集中插入新行,从而避免幻读现象。
    提高并发性能:通过锁定间隙,可以减少不必要的锁竞争,提高并发性能。
  3. 间隙锁的工作原理
    索引锁定:InnoDB 存储引擎通过索引来实现间隙锁。当事务请求对某个范围内的数据进行操作时,InnoDB 会锁定该范围内的间隙。
    Next-Key 锁:Next-Key 锁是行锁和间隙锁的组合,它不仅锁定索引记录,还锁定索引记录之前的间隙。
  4. 间隙锁的示例
    假设有一个表 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 锁。
    性能影响:间隙锁可以提高并发性能,但也可能导致更多的锁竞争,特别是在数据密集的索引中。
0条评论
0 / 1000
c****k
2文章数
0粉丝数
c****k
2 文章 | 0 粉丝
c****k
2文章数
0粉丝数
c****k
2 文章 | 0 粉丝
原创

Mysql 锁机制分析

2024-11-29 09:11:18
0
0

基本类型

主要介绍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 间隙锁的详细解释:

  1. 间隙锁的定义
    间隙:索引中的两个连续记录之间的范围,包括索引的开头和结尾。
    间隙锁:锁定索引中的间隙,防止其他事务在这些间隙中插入新行。
  2. 间隙锁的作用
    防止幻读:在可重复读(Repeatable Read)隔离级别下,间隙锁可以防止其他事务在当前事务的查询结果集中插入新行,从而避免幻读现象。
    提高并发性能:通过锁定间隙,可以减少不必要的锁竞争,提高并发性能。
  3. 间隙锁的工作原理
    索引锁定:InnoDB 存储引擎通过索引来实现间隙锁。当事务请求对某个范围内的数据进行操作时,InnoDB 会锁定该范围内的间隙。
    Next-Key 锁:Next-Key 锁是行锁和间隙锁的组合,它不仅锁定索引记录,还锁定索引记录之前的间隙。
  4. 间隙锁的示例
    假设有一个表 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 锁。
    性能影响:间隙锁可以提高并发性能,但也可能导致更多的锁竞争,特别是在数据密集的索引中。
文章来自个人专栏
c16320vifk专栏
2 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0