Mysql共享锁, 排他锁和意向锁的简单总结
共享锁(Share Lock)
- 共享锁又称读锁, 缩写(S)锁. 共享锁可以重复加, 但与排他锁(X)是有冲突的, 也就是只读
- 使用语法: SELECT … LOCK IN SHARE MODE;
排他锁(Exclusive Lock)
- 排他锁又称写锁, 缩写(X)锁. 排他锁加了, 不允许加其它任何锁
- 使用语法: SELECT … FOR UPDATE;
意向锁(Intent Lock)
- 意向锁是表级锁, 在事务中, 用户申请加行锁时, 数据库会默认先申请意向锁, 也就是数据库自动处理意向锁的.
InnoDB的两种表意向锁
- 意向共享锁(Intent Share Lock), 缩写(IS)锁
- 意向排他锁(Intent Exclusive Lock), 缩写(IX)锁
加锁过程说明
未加意向锁时
: 某 A用户事务中加了行锁, 之后某 B用户申请加表锁, 此时 B用户的请求在数据库内处理冲突的步骤, 首先判断是否已被其它事务加了表锁, 再判断表中是否有个行已被加了行锁, 遍历整张表有意向锁时
: A用户事务中申请意向共享锁, 成功后再申请行锁, 之后 B用户申请加表锁, 此时 B用户的请求在数据库内处理冲突的步骤, 首先判断是否已被其它事务加了表锁, 然后会发现已有意向共享锁锁住了某个行, B进入阻塞, 直到 A释放指定行锁
- 能看出未加意向锁时, 可能会有整表遍历, 导致加锁的性能损失会很严重
各锁之间兼容详情表
- | S | X | IS | IX |
---|---|---|---|---|
S | 兼容 | 冲突 | 兼容 | 冲突 |
X | 冲突 | 冲突 | 冲突 | 冲突 |
IS | 兼容 | 冲突 | 兼容 | 兼容 |
IX | 冲突 | 冲突 | 兼容 | 兼容 |
如果您觉得有帮助,欢迎点赞哦 ~ 谢谢!!