前言
为了保证数据的一致完整性,任何一个数据库都存在锁定机制。锁定机制的优劣直接应想到一个数据库系统的并发处理能力和性能,所以锁定机制的实现也就成为了各种数据库的核心技术之一。
大概几个月之前项目中用到事务,需要保证数据的强一致性,期间也用到了mysql的锁,但当时对mysql的锁机制只是管中窥豹,所以本文打算总结一下mysql的锁机制。
本文主要论述关于mysql锁机制,mysql版本为5.7,引擎为innodb,由于实际中关于innodb锁相关的知识及加锁方式很多,所以没有那么多精力罗列所有场景下的加锁过程并加以分析,仅根据现在了解的知识,结合官方文档,说说自己的理解,如果发现有不对的地方,欢迎指正。
概述
总的来说,InnoDB共有七种类型的锁:
共享/排它锁(Shared and Exclusive Locks) 意向锁(Intention Locks) 记录锁(Record Locks) 间隙锁(Gap Locks) 临键锁(Next-key Locks) 插入意向锁(Insert Intention Locks) 自增锁(Auto-inc Locks)mysql锁详解
1. 共享/排它锁(Shared and Exclusive Locks)
使用的语义为:
共享锁之间不互斥,简记为:读读可以并行 排他锁与任何锁互斥,简记为:写读,写写不可以并行可以看到,一旦写数据的任务没有完成,数据是不能被其他任务读取的,这对并发度有较大的影响。对应到数据库,可以理解为,写事务没有提交,读相关数据的select也会被阻塞,这里的select是指加了锁的,普通的select仍然可以读到数据(快照读)。
2. 意向锁(Intention Locks)
InnoDB为了支持多粒度锁机制(multiple granularity locking),即允许行级锁与表级锁共存,而引入了意向锁(intention locks)。意向锁是指,未来的某个时刻,事务可能要加共享/排它锁了,先提前声明一个意向。
1、意向锁是一个表级别的锁(table-level locking);
2、意向锁又分为:
加锁的语法为:
select ... lock in share mode; 要设置IS锁;select ... for update; 要设置IX锁; |
事务要获得某些行的S/X锁,必须先获得表对应的IS/IX锁,意向锁仅仅表明意向,意向锁之间相互兼容,兼容互斥表如下:
IS | IX | |
IS | 兼 容 | 兼 容 |
IX
学习交流
热门图片
猜你喜欢的新闻
新闻热点 2024-06-26 22:28:41
2024-06-26 22:26:16
2024-06-26 22:23:01
2024-06-25 19:29:23
2024-06-25 19:22:14
2024-06-25 19:19:15
疑难解答 |