大家好,我是半夏之沫 😁😁 一名金融科技领域的JAVA系统研发😊😊
我希望将自己工作和学习中的经验以最朴实,最严谨的方式分享给大家,共同进步👉💓👈
👉👉👉👉👉👉👉👉💓写作不易,期待大家的关注和点赞💓👈👈👈👈👈👈👈👈
👉👉👉👉👉👉👉👉💓关注微信公众号【技术探界】 💓👈👈👈👈👈👈👈👈
前言
MySQL的锁是一个老生常谈的东西了,最近由于不让使用Redis,但是又必须要使用 分布式锁,所以就基于MySQL实现了一个分布式锁,正好就回顾了一下MySQL里面的锁知识,做一个总结,与君共勉。
正文
一. 共享锁
共享锁是 行锁,又称为 读锁,简称 S锁。共享锁有如下特点。
- 数据行允许多个事务获取共享锁;
- 获取共享锁后,只能读取数据,不能修改数据。
共享锁的加锁方式如下。
SELECT * FROM test_table WHERE id=1 LOCK IN SHARE MODE;
共享锁的释放方式如下。
COMMIT/ROLLBACK;
二. 排他锁
排他锁是 行锁,又称为 写锁,简称 X锁。排他锁有如下特点。
- 数据行只允许一个事务获取排他锁;
- 数据行被某个事务获取排他锁后,其它事务不能再获取该数据行的共享锁和排他锁;
- 数据行只能被获取了该数据行排他锁的事务读取和修改。
排他锁的加锁方式如下。
# 自动加锁
DELETE/UPDATE/INSERT语句会默认加上排他锁
# 手动加锁
SELECT * FROM test_table WHERE id=1 FOR UPDATE;
排他锁的释放方式如下。
COMMIT/ROLLBACK;
三. 意向锁
意向锁是由 数据库引擎自己维护且 用户无法手动操作的 表锁。意向锁分为如下两种。
- 意向共享锁(Intention Shared Lock,简称 IS 锁)。表示事务准备获取数据行的共享锁,即获取数据行的共享锁前必须先获得该表的意向共享锁;
- 意向排他锁(Intention Exclusive Lock,简称 IX 锁)。表示事务准备获取数据行的排他锁,即获取数据行的排他锁前必须先获得该表的意向排他锁。
使用意向锁的作用就是 当需要获取表的表锁时,前提就是没有其它事务获取了数据行的行锁,而全表扫描来判断是否有行锁的效率,是低于
判断意向锁是否被获取的。
四. 行锁锁住的是什么
行锁锁住的是 主键索引
。
如果 没有使用索引,此时会全表扫描,并把每一个主键索引锁住,造成锁全表的现象。
五. 记录锁
记录锁(Record Lock),进行唯一性索引(主键/唯一)等值查询并精确匹配时会使用到。如下图所示。
六. 间隙锁
间隙锁(Gap Lock),当查询的记录不存在时会使用到。如下图所示。
关于间隙锁,有如下说明。
- 间隙锁之间并不冲突,但 间隙锁会阻塞插入;
- 假如记录数为N,那么间隙锁的数量为N+1;
- 使用 间隙锁,是为了在 当前读的情况下 解决幻读的问题。
七. 临键锁
临键锁(Next-Key Lock),当范围查询并且包含记录和区间时会使用到。如下图所示。
关于临键锁,有如下说明。
- 临键锁可以理解为 记录锁 + 间隙锁;
- 假如记录数为N,那么间隙锁的数量为N+1;
- 使用 临键锁,是为了在 当前读的情况下 解决幻读的问题。
八. 事务隔离级别的实现
如下表所示。
RR(可重复读) | RC(读已提交) | |
---|---|---|
SELECT(快照读) | MVCC | MVCC |
SELECT ... IN SHARE MODE(当前读) SELECT ... FOR UPDATE(当前读) INSERT UPDATE DELETE | Record Lock(记录锁) Gap Lock(间隙锁) Next-Key Lock(临键锁) | Record Lock(记录锁) |
大家好,我是半夏之沫 😁😁 一名金融科技领域的JAVA系统研发😊😊
我希望将自己工作和学习中的经验以最朴实,最严谨的方式分享给大家,共同进步👉💓👈
👉👉👉👉👉👉👉👉💓写作不易,期待大家的关注和点赞💓👈👈👈👈👈👈👈👈
👉👉👉👉👉👉👉👉💓关注微信公众号【技术探界】 💓👈👈👈👈👈👈👈👈
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。