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

问题:请讲下在mysql中的锁

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

回答要点:

主要从以下几点去考虑,

1、mysql中的锁有哪些?

2、每种锁的使用场景?

 

mysql中的锁主要有读写锁、行锁、间隙锁、next-key

读锁

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

例,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则是用在隔离级别为可重复读下,用来解决幻读;

 

posted @ 2021-04-13 22:40  良工说技术  阅读(340)  评论(0编辑  收藏  举报