java面试一日一题:讲下mysql中的锁

问题:请讲下在mysql中的锁mysql

分析:该问题主要考察对中锁的掌握,主要考察的是读、写锁、行锁、间隙锁、next-key,其余还有表锁、意向锁sql

回答要点:线程

主要从如下几点去考虑,索引

一、mysql中的锁有哪些?事务

二、每种锁的使用场景?innodb

 

mysql种的锁主要有读写锁、行锁、间隙锁、next-keydate

读锁select

读锁,又叫共享锁,简称S锁,用在读操做上,事务A对数据加上了S锁,那么事务A只能进行读操做,其余事务包括A不能再对数据加X锁,可是能够加S锁;next

例,select  ... in share mode数据

写锁

写锁,又叫排他锁,简称X锁,用在写操做上,事务A对数据加了X锁,那么事务A能够对数据进行读取和更新操做,其余线程不能对数据加S锁或X锁,也就是说X锁是排他的,这里的排他是其余的任何锁;

例,select .... for update

行锁

在mysql中读写锁都是行锁,通俗点讲就是锁住的是数据行,这点区别于myIsam的表锁,锁住整个表。innodb下的行锁是经过锁住索引上的索引项来实现的,若是没有索引则锁住每行隐藏的ID

间隙锁

间隙锁,顾名思义,就是锁住的一个范围,间隙锁也是行锁的一种,因此锁定的也是索引项中间的间隙;

next-key锁

next-key就是行锁+间隙锁,也就是锁住记录和它前面的间隙,例,select * from t where id<=7 id的值有1 2 7则(2,7]这就是一个next-key

mysql这种行锁的特色意味着若是查询条件中不走索引,那么innodb将对全部的记录加锁,实际效果跟锁表是同样的(不是表锁)

 

读写锁主要用在事务的隔离级别上,经过设置读写锁能够实现数据的隔离;

next-key则是用在隔离级别为可重复读下,用来解决幻读;