衡阳市网站建设_网站建设公司_HTML_seo优化
2026/1/18 14:28:25 网站建设 项目流程

文章目录

  • MySQL中有哪几种锁?
    • 引言:为什么我们要聊锁?
    • 第一部分:MySQL中的锁类型
      • 1. 表级锁(Table Lock)
        • 示例:MyISAM 表的表级锁
        • 配置建议
      • 2. 行级锁(Row Lock)
        • 示例:InnoDB 表的行级锁
        • 配置建议
      • 3. 页级锁(Page Lock)
        • 示例:InnoDB 表的页级锁
        • 配置建议
      • 4. 间隙锁(Gap Lock)
        • 示例:InnoDB 表的间隙锁
        • 配置建议
      • 5. 共享锁(Shared Lock)
        • 示例:InnoDB 表的共享锁
        • 配置建议
      • 6. 排他锁(Exclusive Lock)
        • 示例:InnoDB 表的排他锁
        • 配置建议
      • 7. 意向锁(Intention Lock)
        • 示例:InnoDB 表的意向锁
        • 配置建议
      • 8. 幻读锁(Phantom Lock)
        • 示例:InnoDB 表的幻读锁
        • 配置建议
      • 9. 行锁(Row Lock)
        • 示例:InnoDB 表的行锁
        • 配置建议
      • 10. 表锁(Table Lock)
        • 示例:MyISAM 表的表锁
        • 配置建议
      • 11. 多粒度锁(Multigranularity Locking)
        • 示例:InnoDB 表的多粒度锁
        • 配置建议
      • 12. 自适应锁(Adaptive Locking)
        • 示例:InnoDB 表的自适应锁
        • 配置建议
      • 13. 锁升级(Lock Escalation)
        • 示例:InnoDB 表的锁升级
        • 配置建议
      • 14. 锁等待(Lock Waiting)
        • 示例:InnoDB 表的锁等待
        • 配置建议
      • 15. 死锁(Deadlock)
        • 示例:InnoDB 表的死锁
        • 配置建议
      • 16. 锁重入(Lock Reentrancy)
        • 示例:InnoDB 表的锁重入
        • 配置建议
      • 17. 锁超时(Lock Timeout)
        • 示例:InnoDB 表的锁超时
        • 配置建议
      • 18. 锁优先级(Lock Priority)
        • 示例:InnoDB 表的锁优先级
        • 配置建议
      • 19. 锁粒度(Lock Granularity)
        • 示例:InnoDB 表的锁粒度
        • 配置建议
      • 20. 锁兼容性(Lock Compatibility)
        • 示例:InnoDB 表的锁兼容性
        • 配置建议
      • 21. 锁监控(Lock Monitoring)
        • 示例:InnoDB 表的锁监控
        • 配置建议
      • 22. 锁优化(Lock Optimization)
        • 示例:InnoDB 表的锁优化

MySQL中有哪几种锁?

大家好!今天呢,我们要聊一个 MySQL 中非常重要但也容易让人头大的话题——锁(Lock)。作为一个刚入行的小白,我第一次接触锁的时候,真的是一脸懵逼。什么表锁、行锁、间隙锁?这名字听着都像武侠小说里的武功招式,但我可是个只会写 SQL 的小虾米啊!不过呢,经过一段时间的学习和实践,我现在终于能跟大家聊聊 MySQL 中的各种锁了。

引言:为什么我们要聊锁?

在数据库的世界里,锁就像是交通警察,它们负责控制数据的访问权限,确保多个用户同时操作数据库时不会发生冲突。想象一下,如果没有锁,多个用户同时修改同一条记录,那岂不是要乱套?所以,锁的作用就是保证数据的一致性和完整性。

但是,锁也不是越多越好。过度使用锁会导致性能问题,甚至可能引发死锁(Deadlock),让整个系统卡死。因此,了解 MySQL 中的各种锁类型,合理使用它们,是我们每个数据库工程师的必修课。

第一部分:MySQL中的锁类型

1. 表级锁(Table Lock)

表级锁是最常见的一种锁类型,它锁定的是整张表。也就是说,当一张表被上锁后,其他用户只能进行读操作,无法写入数据。这种锁通常用于 MyISAM 存储引擎,因为 MyISAM 使用表级锁来保证数据一致性。

示例:MyISAM 表的表级锁
-- 假设我们有一张名为 users 的 MyISAM 表CREATETABLEusers(idINTPRIMARYKEY,nameVARCHAR(50))ENGINE=MyISAM;-- 启动一个事务,对 users 表进行写操作STARTTRANSACTION;UPDATEusersSETname='小明'WHEREid=1;

当上述 SQL 执行时,整个users表都会被锁定。其他会话尝试更新或插入数据时会被阻塞,直到当前事务提交或回滚。

配置建议

如果你的系统需要高并发写入,MyISAM 的表级锁可能不太适合你。这时候可以考虑使用 InnoDB 存储引擎,因为它支持行级锁。

2. 行级锁(Row Lock)

相比于表级锁,行级锁锁的是单条记录,粒度更细。InnoDB 存储引擎默认使用行级锁,这样在高并发场景下能提供更好的性能。

示例:InnoDB 表的行级锁
-- 假设我们有一张名为 users 的 InnoDB 表CREATETABLEusers(idINTPRIMARYKEY,nameVARCHAR(50))ENGINE=InnoDB;-- 启动一个事务,对 users 表进行写操作STARTTRANSACTION;UPDATEusersSETname='小红'WHEREid=2;

此时,只有id=2这条记录被锁定,其他记录仍然可以正常操作。

配置建议

为了充分发挥行级锁的优势,确保你的 SQL 语句尽可能高效。比如,避免使用SELECT *,而是明确指定需要的字段。

3. 页级锁(Page Lock)

页级锁是 MySQL 中介于表级锁和行级锁之间的一种锁类型。它锁定的是数据库中的一页数据,通常在 InnoDB 存储引擎中使用。

示例:InnoDB 表的页级锁
-- 假设我们有一张名为 users 的 InnoDB 表CREATETABLEusers(idINTPRIMARYKEY,nameVARCHAR(50))ENGINE=InnoDB;-- 启动一个事务,对 users 表进行写操作STARTTRANSACTION;UPDATEusersSETname='小刚'WHEREid=3;

此时,id=3所在的页会被锁定。如果一页中有多个记录,那么这些记录都会被锁定。

配置建议

页级锁通常由 MySQL 自动管理,我们不需要手动配置。但可以通过调整innodb_page_size来优化性能。

4. 间隙锁(Gap Lock)

间隙锁是 InnoDB 存储引擎中为了防止幻读而引入的一种锁类型。它锁定的是索引中的一个范围,而不是具体的行。

示例:InnoDB 表的间隙锁
-- 假设我们有一张名为 users 的 InnoDB 表,并且有一个唯一索引在 id 列上CREATETABLEusers(idINTPRIMARYKEY,nameVARCHAR(50))ENGINE=InnoDB;-- 启动一个事务,对 users 表进行写操作STARTTRANSACTION;SELECT*FROMusersWHEREid>1ANDid<4FORUPDATE;

此时,id=2id=3之间的间隙会被锁定,防止其他事务插入新的记录。

配置建议

如果你的系统中存在大量并发写入操作,可以考虑调整innodb_locks_unsafe_for_binlog参数来优化性能。

5. 共享锁(Shared Lock)

共享锁也称为读锁,允许多个用户同时对同一数据进行读操作,但阻止其他用户进行写操作。

示例:InnoDB 表的共享锁
-- 假设我们有一张名为 users 的 InnoDB 表CREATETABLEusers(idINTPRIMARYKEY,nameVARCHAR(50))ENGINE=InnoDB;-- 启动一个事务,对 users 表进行读操作STARTTRANSACTION;SELECT*FROMusersWHEREid=1FORSHARE;

此时,id=1这条记录被共享锁锁定,其他用户可以读取这条记录,但无法修改它。

配置建议

如果你的系统需要频繁读取数据,使用共享锁是一个不错的选择。但要注意不要滥用,否则可能会影响写性能。

6. 排他锁(Exclusive Lock)

排他锁也称为写锁,阻止其他用户对同一数据进行读或写操作,直到当前事务提交或回滚。

示例:InnoDB 表的排他锁
-- 假设我们有一张名为 users 的 InnoDB 表CREATETABLEusers(idINTPRIMARYKEY,nameVARCHAR(50))ENGINE=InnoDB;-- 启动一个事务,对 users 表进行写操作STARTTRANSACTION;SELECT*FROMusersWHEREid=2FORUPDATE;

此时,id=2这条记录被排他锁锁定,其他用户无法读取或修改这条记录。

配置建议

排他锁通常由 MySQL 自动管理,我们不需要手动配置。但可以通过调整innodb_lock_wait_timeout来优化性能。

7. 意向锁(Intention Lock)

意向锁是 InnoDB 存储引擎中为了协调行级锁和表级锁而引入的一种锁类型。它表示一个事务意图在某个范围内获取行级锁。

示例:InnoDB 表的意向锁
-- 假设我们有一张名为 users 的 InnoDB 表CREATETABLEusers(idINTPRIMARYKEY,nameVARCHAR(50))ENGINE=InnoDB;-- 启动一个事务,对 users 表进行写操作STARTTRANSACTION;SELECT*FROMusersWHEREid=3FORUPDATE;

此时,InnoDB 会自动为users表加上意向排他锁,表示该事务意图在表中获取行级锁。

配置建议

意向锁通常由 MySQL 自动管理,我们不需要手动配置。但可以通过调整innodb_max_locks来优化性能。

8. 幻读锁(Phantom Lock)

幻读锁是 InnoDB 存储引擎中为了防止幻读而引入的一种锁类型。它锁定的是索引中的一个范围,而不是具体的行。

示例:InnoDB 表的幻读锁
-- 假设我们有一张名为 users 的 InnoDB 表,并且有一个唯一索引在 id 列上CREATETABLEusers(idINTPRIMARYKEY,nameVARCHAR(50))ENGINE=InnoDB;-- 启动一个事务,对 users 表进行写操作STARTTRANSACTION;SELECT*FROMusersWHEREid>1ANDid<4FORUPDATE;

此时,id=2id=3之间的间隙会被锁定,防止其他事务插入新的记录。

配置建议

如果你的系统中存在大量并发写入操作,可以考虑调整innodb_locks_unsafe_for_binlog参数来优化性能。

9. 行锁(Row Lock)

行锁是 InnoDB 存储引擎中最细粒度的锁类型,锁定的是具体的行记录。

示例:InnoDB 表的行锁
-- 假设我们有一张名为 users 的 InnoDB 表CREATETABLEusers(idINTPRIMARYKEY,nameVARCHAR(50))ENGINE=InnoDB;-- 启动一个事务,对 users 表进行写操作STARTTRANSACTION;SELECT*FROMusersWHEREid=4FORUPDATE;

此时,id=4这条记录被行锁锁定,其他用户无法读取或修改这条记录。

配置建议

行锁通常由 MySQL 自动管理,我们不需要手动配置。但可以通过调整innodb_lock_wait_timeout来优化性能。

10. 表锁(Table Lock)

表锁是 MySQL 中最粗粒度的锁类型,锁定的是整个表,阻止其他用户对表进行任何操作,直到当前事务提交或回滚。

示例:MyISAM 表的表锁
-- 假设我们有一张名为 users 的 MyISAM 表CREATETABLEusers(idINTPRIMARYKEY,nameVARCHAR(50))ENGINE=MyISAM;-- 启动一个事务,对 users 表进行写操作STARTTRANSACTION;SELECT*FROMusersFORUPDATE;

此时,整个users表被表锁锁定,其他用户无法读取或修改该表中的任何记录。

配置建议

如果你的系统中存在大量并发写入操作,可以考虑将表引擎从 MyISAM 切换到 InnoDB,以获得更好的性能和扩展性。

11. 多粒度锁(Multigranularity Locking)

多粒度锁是 InnoDB 存储引擎中的一种机制,允许在同一事务中同时持有不同粒度的锁(如行锁、页锁、表锁等)。

示例:InnoDB 表的多粒度锁
-- 假设我们有一张名为 users 的 InnoDB 表CREATETABLEusers(idINTPRIMARYKEY,nameVARCHAR(50))ENGINE=InnoDB;-- 启动一个事务,对 users 表进行写操作STARTTRANSACTION;SELECT*FROMusersWHEREid=5FORUPDATE;

此时,InnoDB 会为id=5这条记录加上行锁,同时为整个表加上意向排他锁。

配置建议

多粒度锁通常由 MySQL 自动管理,我们不需要手动配置。但可以通过调整innodb_locks_unsafe_for_binlog参数来优化性能。

12. 自适应锁(Adaptive Locking)

自适应锁是 InnoDB 存储引擎中的一种机制,可以根据系统的负载情况自动调整锁的粒度和类型。

示例:InnoDB 表的自适应锁
-- 假设我们有一张名为 users 的 InnoDB 表CREATETABLEusers(idINTPRIMARYKEY,nameVARCHAR(50))ENGINE=InnoDB;-- 启动一个事务,对 users 表进行写操作STARTTRANSACTION;SELECT*FROMusersWHEREid=6FORUPDATE;

此时,InnoDB 会根据系统的负载情况自动决定是否使用行锁、页锁或表锁。

配置建议

自适应锁通常由 MySQL 自动管理,我们不需要手动配置。但可以通过调整innodb_adaptive_hash_index参数来优化性能。

13. 锁升级(Lock Escalation)

锁升级是 InnoDB 存储引擎中的一种机制,当一个事务持有大量行锁时,InnoDB 可能会将这些行锁升级为更粗粒度的锁(如页锁或表锁),以减少内存中的锁数量和提高性能。

示例:InnoDB 表的锁升级
-- 假设我们有一张名为 users 的 InnoDB 表CREATETABLEusers(idINTPRIMARYKEY,nameVARCHAR(50))ENGINE=InnoDB;-- 启动一个事务,对 users 表进行写操作STARTTRANSACTION;SELECT*FROMusersWHEREidBETWEEN1AND100FORUPDATE;

此时,InnoDB 可能会将这些行锁升级为页锁或表锁,以减少内存中的锁数量和提高性能。

配置建议

锁升级通常由 MySQL 自动管理,我们不需要手动配置。但可以通过调整innodb_lockescalation参数来控制锁升级的行为。

14. 锁等待(Lock Waiting)

锁等待是当一个事务请求的锁被另一个事务持有时,该事务进入等待状态,直到锁被释放为止。

示例:InnoDB 表的锁等待
-- 会话 A:STARTTRANSACTION;SELECT*FROMusersWHEREid=7FORUPDATE;-- 会话 B:STARTTRANSACTION;SELECT*FROMusersWHEREid=7FORUPDATE;

此时,会话 B 必须等待会话 A 释放id=7的行锁后才能继续执行。

配置建议

锁等待通常由 MySQL 自动管理,我们不需要手动配置。但可以通过调整innodb_lock_wait_timeout参数来控制事务在获取锁时的超时时间。

15. 死锁(Deadlock)

死锁是当两个或多个事务互相持有对方需要的资源而无法继续执行的情况。InnoDB 存储引擎会检测到死锁并回滚其中一个事务以打破僵局。

示例:InnoDB 表的死锁
-- 会话 A:STARTTRANSACTION;SELECT*FROMusersWHEREid=8FORUPDATE;-- 会话 B:STARTTRANSACTION;SELECT*FROMusersWHEREid=9FORUPDATE;-- 会话 A:SELECT*FROMusersWHEREid=9FORUPDATE;-- 会话 B:SELECT*FROMusersWHEREid=8FORUPDATE;

此时,会话 A 和会话 B 形成一个死锁,InnoDB 会回滚其中一个事务以打破僵局。

配置建议

死锁通常由 MySQL 自动管理,我们不需要手动配置。但可以通过调整innodb_deadlock_timeout参数来控制死锁检测的时间间隔。

16. 锁重入(Lock Reentrancy)

锁重入是当一个事务在持有某个锁的情况下再次请求相同的锁时,允许其继续执行而不必等待锁释放的机制。

示例:InnoDB 表的锁重入
-- 启动一个事务,对 users 表进行写操作STARTTRANSACTION;SELECT*FROMusersWHEREid=10FORUPDATE;-- 在同一个事务中,再次请求相同的锁SELECT*FROMusersWHEREid=10FORUPDATE;

此时,InnoDB 允许该事务重入锁而不必等待锁释放。

配置建议

锁重入通常由 MySQL 自动管理,我们不需要手动配置。但可以通过调整innodb_lock_reentrancy参数来控制锁重入的行为。

17. 锁超时(Lock Timeout)

锁超时是当一个事务在获取锁时等待超过一定时间后自动回滚或放弃获取锁的机制。

示例:InnoDB 表的锁超时
-- 启动一个事务,对 users 表进行写操作STARTTRANSACTION;SELECT*FROMusersWHEREid=11FORUPDATE;-- 在另一个会话中,等待一段时间后回滚事务SLEEP(10);ROLLBACK;

此时,如果innodb_lock_wait_timeout设置为 5 秒,那么在第 5 秒时,该事务会因为锁超时而回滚。

配置建议

锁超时通常由 MySQL 自动管理,我们可以通过调整innodb_lock_wait_timeout参数来设置锁等待的超时时间。

18. 锁优先级(Lock Priority)

锁优先级是当多个事务同时请求同一资源时,根据优先级决定哪个事务先获得锁的机制。

示例:InnoDB 表的锁优先级
-- 启动一个高优先级事务SET@@global.tx_isolation='READ-COMMITTED';STARTTRANSACTION;SELECT*FROMusersWHEREid=12FORUPDATE;-- 启动一个低优先级事务SET@@global.tx_isolation='SERIALIZABLE';STARTTRANSACTION;SELECT*FROMusersWHEREid=12FORUPDATE;

此时,高优先级事务可能会先获得锁。

配置建议

锁优先级通常由 MySQL 的隔离级别决定。可以通过调整tx_isolation参数来设置事务的隔离级别和锁优先级。

19. 锁粒度(Lock Granularity)

锁粒度是锁所作用的数据范围,包括行锁、页锁和表锁等。InnoDB 支持细粒度的行锁,默认情况下使用行锁以提高并发性能。

示例:InnoDB 表的锁粒度
-- 启动一个事务,对 users 表进行写操作STARTTRANSACTION;SELECT*FROMusersWHEREid=13FORUPDATE;-- 在另一个会话中,可以同时更新其他行而不受阻塞UPDATEusersSETname='test'WHEREid=14;

此时,InnoDB 使用行锁,允许并发更新不同的行。

配置建议

锁粒度通常由 MySQL 自动管理,但可以通过调整innodb_locks_unsafe_for_binlog参数来控制是否使用不安全的行锁以提高性能。

20. 锁兼容性(Lock Compatibility)

锁兼容性是不同类型的锁在共享或排他时是否允许并存的关系。例如,共享锁与共享锁兼容,而排他锁与其他任何锁都不兼容。

示例:InnoDB 表的锁兼容性
-- 会话 A:STARTTRANSACTION;SELECT*FROMusersWHEREid=14FORUPDATE;-- 会话 B:STARTTRANSACTION;SELECT*FROMusersWHEREid=14LOCKINSHAREMODE;

此时,会话 B 必须等待会话 A 释放排他锁后才能获得共享锁。

配置建议

锁兼容性通常由 MySQL 的锁管理机制决定,我们不需要手动配置。但可以通过调整innodb_lock_mode参数来控制锁的类型和行为。

21. 锁监控(Lock Monitoring)

锁监控是通过各种工具和命令查看当前系统的锁状态、等待情况等信息,以便优化数据库性能和解决死锁问题。

示例:InnoDB 表的锁监控
-- 查看当前所有锁的信息SELECT*FROMINFORMATION_SCHEMA.INNODB_LOCKS;-- 查看当前所有锁的等待情况SELECT*FROMINFORMATION_SCHEMA.INNODB_LOCK_WAITS;

此时,可以通过这些视图了解当前系统的锁状态和等待情况。

配置建议

锁监控通常通过 MySQL 提供的信息模式视图来实现。我们可以通过定期查询这些视图来监控锁的状态和性能。

22. 锁优化(Lock Optimization)

锁优化是通过调整数据库设计、事务隔离级别、索引策略等方式,减少锁竞争和提高并发性能的过程。

示例:InnoDB 表的锁优化
-- 使用更细粒度的锁ALTERTABLEusersADDINDEXidx_name(name);-- 减少事务持有锁的时间COMMIT;---### 📚 领取 | 1000+ 套高质量面试题大合集(无套路,闫工带你飞一把)!你想做外包吗?闫工就是外包出身,但我已经上岸了!你也想上岸吗? 闫工精心准备了程序准备面试?想系统提升技术实力?闫工精心整理了**1000+套涵盖前端、后端、算法、数据库、操作系统、网络、设计模式等方向的面试真题+详细解析**,并附赠高频考点总结、简历模板、面经合集等实用资料! ✅ 覆盖大厂高频题型 ✅ 按知识点分类,查漏补缺超方便 ✅ 持续更新,助你拿下心仪 Offer! 📥**免费领取**👉[点击这里获取资料](https://download.csdn.net/download/yp25805488/92419871?spm=1001.2014.3001.5501)>已帮助数千位开发者成功上岸,下一个就是你!✨

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询