33| InnoDB锁定和死锁问题:为什么我的SQL锁超时了?
俊达
你好,我是俊达。
这一讲我们来聊一聊 MySQL 中的锁。MySQL 中,存在很多不同类型的锁,我们先来大致了解下不同锁的作用。
MySQL 中的锁
MySQL 使用锁来控制多个并发的进程或线程对共享资源的访问。那么在 MySQL 中,有哪些共享资源呢?
我总结起来,大致有下面这几种类型。
内存中的数据结构。
内存中的链表结构,如会话列表、活跃事务列表、InnoDB Buffer Pool 中 LRU 链表、Flush 链表、Hash 链表等等。
内存中的变量,如 REDO 日志序列号、下一个事务的事务 ID。
缓存的页面。
元数据,包括表、SCHEMA、存储过程等。
表和表里的记录。
MySQL 使用了不同类型的锁,来保护这些不同类型的共享资源,对于上面提到的这几类资源,MySQL 分别使用了下面这些类型的锁。
mutex 和 rw-lock,用于保护内存中的数据结构。使用 show engine innodb status、show engine innodb mutex 等命令可以查看到一些 mutex 的信息。
元数据锁(metadata lock),用于管理对数据库对象的并发访问。查询数据(Select)、修改数据(insert、update、delete)、修改表结构时都需要先获取表的元数据锁。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
1. MySQL中的不同类型的锁用于控制多个并发的进程或线程对共享资源的访问,包括内存中的数据结构、链表结构、变量、缓存的页面、元数据以及表和表里的记录。 2. InnoDB中的锁可以分为表锁、意向锁、行锁和自增ID锁,这些锁可以在performance_schema库中的data_locks表和data_lock_waits表中查看当前系统中有哪些锁,以及锁等待关系。 3. 了解不同类型的锁以及它们的使用场景对于优化数据库性能和避免锁相关的问题非常重要。 4. InnoDB使用意向锁的原因是为了在多个会话对同一表进行操作时,能够更好地判断会话能否获取到表锁。 5. 插入意向锁和自增ID锁是InnoDB中特殊的锁类型,它们在插入数据时起到重要作用,需要先获取这些锁才能进行插入操作。 6. 通过观察performance_schema库中的data_locks表和data_lock_waits表,可以了解当前系统中的锁情况和锁等待关系,有助于排查锁相关的性能问题。 7. 半一致性读取是指在满足特定条件下,update语句可以使用一致性读取,先不加锁,再根据条件重新读取记录,有助于提高并发性能。 8. 插入意向锁在InnoDB中用于保证插入操作的顺序和唯一性约束,对于保证数据完整性非常重要。 9. 隐藏的锁和唯一索引、主键相关,用于保证数据的唯一性约束和避免数据冲突。 10. 死锁是数据库中常见的问题,通过监控数据库中的锁等待和死锁情况,可以及时发现并解决潜在的性能问题。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《MySQL 运维实战课》,新⼈⾸单¥59
《MySQL 运维实战课》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
精选留言
由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论