MySQL锁
为了保证数据的一致完整性,任何一个数据库都存在锁定机制。锁定机制的优劣直接影响到一个数据库系统的并发处理能力和性能,所以锁定机制的实现也就成为了各种数据库的核心技术之一
三种不同的锁类型
名称 | 粒度 | 并发能力 | 加锁和释放锁的消耗 | 出现死锁概率 |
---|---|---|---|---|
row-level | 最小 | 最大 | 消耗大 | 高 |
page-level | 中 | 中 | 中 | 中 |
table-level | 最大 | 比较弱 | 消耗小 | 低 |
锁机制分析
表级锁定
使用了:read、read_wait、write、write_wait四个队列实现
使用方法 : lock table my_table read、lock table my_table write;
行级锁定
这里主要说下InnoDB使用了"间隙锁",也就是,根据锁定大是一个范围。
具体可以参考【间隙锁产生的原因】
锁优化
目标就是,缩短锁定的时间。
-
合理设计索引,避免因为间隙锁,而影响到其他Query
-
能者多劳,搜索的时候尽可能使用索引,并且索引范围尽可能小,避免因为无法使用索引加锁而变成表锁
-
业务层面,在同一个事务中,尽可能做到一次锁定需要的所有资源,减少死锁产生的概率;
-
对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁定来减少死锁产生的概率。
其他
这里补充下InnoDB 的优点
-
支持事务安全:READ UNCOMMITTED、READ COMMITTED、REPEATABLE和SERIALIZABLE
-
锁定机制的改进
参考文章
了解下Mysql的间隙锁及产生的原因
参考书籍<<MySQL性能调优和架构设计>>