mysql共享锁与排他锁

共享锁又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。

排他锁又称为写锁,简称X锁,顾名思义,排他锁就是不能与其他所并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改。

对于共享锁大家可能很好理解,就是多个事务只能读数据不能改数据,对于排他锁大家的理解可能就有些差别,以为排他锁锁住一行数据后,其他事务就不能读取和修改该行数据,其实不是这样的。排他锁指的是一个事务在一行数据加上排他锁后,其他事务不能再在其上加其他的锁,但是可以不加锁操作(如默认select就不加锁)。
mysql InnoDB引擎默认的修改数据语句,update,delete,insert都会自动给涉及到的数据加上排他锁,select语句默认不会加任何锁类型,如果加排他锁可以使用select ...for update语句,加共享锁可以使用select ... lock in share mode语句。所以加过排他锁的数据行在其他事务种是不能修改数据的,也不能通过for update和lock in share mode锁的方式查询数据,但可以直接通过select ...from...查询数据,因为普通查询没有任何锁机制。

select 默认不加锁
select ...for update 加排他锁,
select ... lock in share mode 加共享锁
update delete insert 默认加排它锁
所以一条记录不管是被加排它锁还是共享锁,其它select默认都可以读取执行,但是
当记录被加上排它锁,则其他 sql 不能在给他加任何锁:排它锁、共享锁,可以不加锁
当记录被加上共享锁,则其他 sql 不能在给他加排他锁,可以加共享锁或者不加锁

 

基于索引使用范围条件检索数据时,会给符合检索条件的记录的索引项加锁,对于范围内当不存在的记录(称为间隙)加间隙锁Next-Key锁。

 

https://www.jianshu.com/p/fb30f6b5dfc7

posted @ 2018-10-31 15:01  zbjice  阅读(337)  评论(0)    收藏  举报