Mysql 锁
锁类型
共享锁(S)
排它锁(X)
意向共享锁(IS)
意向排他锁(IX)
锁的算法
记录锁(Record Locks)
间隙锁(Gap Locks)
临建锁(Next-key Locks)
共享锁(S):又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改;
加锁释锁方式:
set session autocommit = OFF; select * from users WHERE id=1 LOCK IN SHARE MODE; commit/rollback
排它锁(X):又称为写锁,简称X锁,排他锁不能与其他锁并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的锁(共享锁、排他锁),只有该获取了排他锁的事务是可以对数据行进行读取和修改,(其他事 务要读取数据可来自于快照)
加锁释锁方式:
set session autocommit=OFF; SELECT * FROM table_ name WHERE id=1 FOR UPDATE; commit/rollback;
delete / update / insert默认加上X锁
意向共享锁(IS)和意向排它锁(IX)统称为意向锁(IS、IX)
意向锁是InnoDB数据操作之前自动加的,不需要用户干预。当用户给行添加S或者X锁的时候,会自动的给表加上IS和IX锁。
意向锁主要是用来标识该表是否已经有行被加上锁了,如果有事务试图给表加上表锁(lock tables xx read/write ),就会先看改表是否有共享锁,如果有就不能加锁,主要是为了提高效率,如果没有这个标识,就需要遍历所有的行,看有没有锁,会浪费很多的资源,降低效率。
innodb-行锁到底锁了什么?
行锁最终都是通过锁定索引来实现的,如果锁定行的时候没有命中索引,就会用表锁来锁定。
为什么锁住辅助索引 主键索引也会被锁住?
因为用辅助索引查询数据的时候有个回表的操作,所以也会把主键索引锁住,同时也可以说明,对于同一行数据,如果一个索引被锁住了,其他的索引页相当于被锁住了,因为主键索引最终会被锁住,所以其他索引在回表的时候都会被锁住。
记录锁(Record)&间隙锁(Gap)&临键锁(Next-key):这三类锁只是针对共享锁和排他锁的算法
记录锁(Record locks):
锁住具体的索引项,当sq|执行按照唯一-性(Primarykey、Uniquekey)索引进行数据的检索时,查询条件等值匹配且查询的数据是存在,这时SQL语句加上的锁即为记录锁Record locks, 锁住具体的索引项。
间隙锁(Gap locks)
锁住数据不存在的区间(左开右开),当sql执行按照索引进行数据的检索时,查询条件的数据不存在,这时SQL语句加上的锁即为Gap locks, 锁住索引不存在的区间(左开右开)
临键锁(Next-key locks)
锁住记录+区间(左开右闭),当sq|执行按照索引进行数据的检索时,查询条件为范围查找(betweenand、<、>等)并有数据命中则此时SQL语句加上的锁为Next-key locks, 锁住索引的记录+区间(左开右闭)
MVCC是什么?
Multiversion concurrency control多版本并发控制),并发访问(读或写)数据库时,对正在事务内处理的数据做多版本的管理。以达到用来避免写操作的堵塞,从而引发读操作的并发问题。
MVCC只是用于select查询,不同的事物隔离级别MVCC的规则是不一样的。