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;