Mysql锁的理解

本博客根据个人理解,整理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.csdn.net/u010841296/article/details/84204701

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值