MySQL 中有哪些锁类型?
一、按锁的粒度分类1. 全局锁作用范围锁定整个数据库实例典型命令FLUSH TABLES WITH READ LOCK用途用于全库备份保证数据一致性特点所有数据库的写操作都会被阻塞2. 表级锁表锁读锁共享锁LOCK TABLES t READ写锁排他锁LOCK TABLES t WRITE特点开销小加锁快但并发度低元数据锁MDL自动加锁无需显式声明保证表结构变更与数据操作的一致性读操作加读锁写操作加写锁意向锁意向共享锁IS事务打算在表的某些行上加共享锁意向排他锁IX事务打算在表的某些行上加排他锁作用快速判断表是否被加锁避免逐行检查3. 行级锁记录锁锁定单行记录间隙锁锁定索引记录之间的间隙防止幻读临键锁记录锁 间隙锁的组合特点并发度高但开销大加锁慢二、按锁的类型分类1. 共享锁Shared LockS锁允许其他事务也加共享锁不允许其他事务加排他锁用于读操作显式加锁SELECT ... LOCK IN SHARE MODE或SELECT ... FOR SHARE2. 排他锁Exclusive LockX锁不允许其他事务加任何锁用于写操作INSERT、UPDATE、DELETE显式加锁SELECT ... FOR UPDATE三、按锁的模式分类1. 乐观锁不使用数据库锁机制通过版本号或时间戳实现适用于读多写少的场景实现方式UPDATEtableSETvaluenew_value,versionversion1WHEREid?ANDversionold_version2. 悲观锁假定冲突会发生先加锁再操作使用数据库提供的锁机制适用于写多读少的场景四、InnoDB 存储引擎的锁1. 行锁实现基于索引实现如果不走索引会退化为表锁支持多种行锁模式记录锁锁定精确的索引记录间隙锁锁定不存在的记录间隙临键锁默认的行锁模式2. MVCC多版本并发控制通过 Undo Log 实现读写不冲突快照读不加锁读取历史版本当前读需要加锁读取最新版本五、死锁相关死锁产生条件互斥条件资源不能共享请求与保持持有锁的同时请求其他锁不剥夺不能强行释放已持有的锁循环等待形成等待环路死锁处理InnoDB 自动检测死锁并回滚事务可以通过SHOW ENGINE INNODB STATUS查看死锁信息设置innodb_lock_wait_timeout参数控制等待时间六、锁的兼容性矩阵锁类型ISIXSXIS✓✓✓✗IX✓✓✗✗S✓✗✓✗X✗✗✗✗七、常用锁相关命令-- 查看当前锁等待情况SELECT*FROMinformation_schema.INNODB_LOCKS;SELECT*FROMinformation_schema.INNODB_LOCK_WAITS;-- 查看事务信息SELECT*FROMinformation_schema.INNODB_TRX;-- 查看死锁信息SHOWENGINEINNODBSTATUS;-- 设置锁等待超时时间SETGLOBALinnodb_lock_wait_timeout50;总结MySQL 的锁机制设计非常完善不同粒度的锁适用于不同的场景全局锁全库备份表级锁并发度要求不高的场景行级锁高并发场景InnoDB 默认使用意向锁提高表锁检查效率MVCC提高读并发性能理解这些锁类型对于优化数据库性能、解决并发问题非常重要。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2421299.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!