Mysql中的锁机制

本文介绍了MySQL的锁机制,包括读锁(共享锁)、写锁(排它锁)和间隙锁。读锁允许多个线程同时读取数据,但阻止写操作;写锁则阻止其他线程的读写操作。间隙锁在范围查询时锁定索引间隙,防止插入数据。通过`FOR UPDATE`关键字可锁定特定行数据。
摘要由CSDN通过智能技术生成

mysql锁机制:

1、什么是锁?

锁是计算机控制多个进程或者线程,对统一资源访问的一种机制。


2、锁的分类:

按对数据操作的类型上分为:读锁,写锁;
按照锁的粒度分为:表锁,行锁。

读锁:即共享锁,针对同一份数据,多个操作可以同时运行而不会相互影响。
写锁:即排它锁,当前写操作没有完成前,它会阻断其他写锁和读锁。


3、共享锁

例如:
有两个线程,A和B线程。
A线程先把user表加上读锁:lock table user read;
此时,A线程只能读user表的数据,不能修改user表的数据,且不能读写其他表数据。
A线程对user表加了读锁,B线程可以读写未加锁的其他表,也可以读user表,但写user表将会产生阻塞状态,即一直等待,直到A线程解开user表的读锁,B线程的写操作才会从阻塞状态到开始执行。
解开锁语句:unlock tables;

说的通俗一点,假设家里有个玩具(user表),有2个兄弟(线程A和线程B),A说,这个玩具只允许看不能摸(对user表加了读锁,只能读,不能写)。
A说完之后肯定自己言出必行,情有独钟地对这个玩具进行观赏(只对user表进行读操作,不能操作其他表)。
B也就只能听大哥的话(可以对user表进行读操作),但不影响B去朋友家里玩其他玩具(对其他表读写操作)。
等待A撤销这个规定,B终于能玩到这个玩具。滑稽!


4、排它锁

A线程加了写锁:lock table user write;
A线程只能对user表进行读写,不能操作其他表;
B线程读写user将受到阻塞,但B可以操作其他表;
只有A线程解开锁,B对user表的操作将从阻塞到立即执行。

结论:
加读锁,不会阻塞其它线程对同一表的读请求,但会阻塞对同一张表的写请求。只有当读锁释放后,才会执行其它线程的写操作;
加写锁,会阻塞其它线程对同一张表的读和写操作,只有当写锁释放后,才会执行其它线程的读写操作。

简而言之:读锁阻塞写,写锁都阻塞


5、查看哪些表被加锁

show open tables;


6、间隙锁

(1)什么是间隙锁?

当我们用范围条件,而不是相等条件检索数据时,并请求共享或者排它锁时,InnoDB会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内但并不存在的记录,叫做“间隙(GAP)”,InnoDB也会对这个“间隙”加锁,这种锁机制就是间隙锁(Next-Key锁)。

(2)间隙锁的危害

因为执行过程中通过范围查找的话,它会锁定整个范围内所有的索引键值,即使这个键值并不存在,而造成在锁定的时候,阻塞插入锁定键值范围内的任何数据。


7、如何锁定某一行数据?
update user set name=’zhangsan’ where id=1001 for update;


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值