本博客根据个人理解,整理Mysql锁,欢迎大佬批评指导
一、锁分类
按照官方分类,锁共有四类,共享锁S、排他锁X、意向共享锁IS、意向排他锁IX,但去要理清楚锁之间的关系,这样分类是比较难的,因此根据自我理解,将锁分为以下6类。但想要要说以下6类,还需要理解初步锁概念即什么是共享锁,排他锁、意向锁。
共享锁Shared Locks(S锁)
1、兼容性:加了S锁的记录,允许其他事务再加S锁,不允许其他事务再加X锁
2、加锁方式:select…lock in share mode
排他锁Exclusive Locks(X锁)
1、兼容性:加了X锁的记录,不允许其他事务再加S锁或者X锁
2、加锁方式:select…for update
意向锁 Intention Locks,意向锁相互兼容
1、表明“某个事务正在某些行持有了锁、或该事务准备去持有锁”
2、获取锁前必须先取得该表对应的意向锁
3、意向锁不能显示调用,是由数据引擎自动加载的。
1.1、行共享锁S
使用查询语句SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE 时,通过索引条件检索数据,InnoDB 使用行级锁
1.2、行排他锁X
写操作(update、delete、insert)通过索引条件检索数据,InnoDB 才使用行级锁,否则,InnoDB 将使用表锁!
1.3、表共享锁S
使用查询语句SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE 时,没有通过索引条件检索数据,InnoDB 使用表锁!
1.4、表排他锁X
写操作(update、delete、insert)没有通过索引条件检索数据,InnoDB 将使用表锁!
1.5、表意向共享锁IS
获取共享锁前,先获取表意向共享锁
1.6、表意向排他锁IX
获取排他锁前,先获取表意向排他锁
二、InnoDB加锁方法:
- 意向锁是 InnoDB 自动加的, 不需用户干预。
- 对于 UPDATE、 DELETE 和 INSERT 语句, InnoDB
会自动给涉及数据集加排他锁(X); - 对于普通 SELECT 语句,InnoDB 不会加任何锁;
事务可以通过以下语句显式给记录集加共享锁或排他锁:- 共享锁(S):SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE。 其他 session 仍然可以查询记录,并也可以对该记录加 share mode 的共享锁。但是如果当前事务需要对该记录进行更新操作,则很有可能造成死锁。
- 排他锁(X):SELECT * FROM table_name WHERE ... FOR UPDATE。其他 session 可以查询该记录,但是不能对该记录加共享锁或排他锁,而是等待获得锁
参考
MySQL锁总结 https://zhuanlan.zhihu.com/p/29150809
Mysql锁详解(行锁、表锁、意向锁、Gap锁、插入意向锁) https://blog.youkuaiyun.com/u010841296/article/details/84204701