欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Mysql数据库中锁的种类

程序员文章站 2022-06-04 11:07:23
...

 

Mysql是我们常用的数据库,为了保证数据的并发操作而不出错,需要多种锁来操作。下面介绍一下数据库的隔离基本在RR(可重复读)级别下常用的几种锁

行锁(Record Lock)

(1)记录锁, 仅仅锁住索引记录的一行,在单条索引记录上加锁。
(2)record lock锁住的永远是索引,而非记录本身,即使该表上没有任何索引,那么innodb会在后台创建一个隐藏的聚集主键索引,那么锁住的就是这个隐藏的聚集主键索引。

如果执行的语句如下:

select * from db_table where uniqu_id=1;

其中,uniqu_id=1是数据表db_table的唯一性索引,所以这一条语句是加行锁,加在uniqu_id这个字段的索引上。只使用唯一索引查询,并且只锁定一条记录时,innoDB会使用行锁。如果uniqu_id不是索引而是一个普通的字段,则这一条语句是一个表锁,即锁住整张表。

间隙锁(gap Lock)

在索引记录之间的间隙中加锁,或者是在某一条索引记录之前或者之后加锁,并不包括该索引记录本身。gap lock的机制主要是解决可重复读模式下的幻读问题。

使用普通索引检索时,不管是何种查询,只要加锁,都会产生间隙锁。如:

select * from db_table where name=3;

这里name字段是普通索引,这一条语句会加间隙锁

后码锁(next-key Lock)

所谓Next-Key Locks,就是Record lock和gap lock的结合,即除了锁住记录本身,还要再锁住索引之间的间隙。

只使用唯一索引查询,但是检索条件是范围检索,或者是唯一检索然而检索结果不存在(试图锁住不存在的数据)时,会产生 Next-Key Lock。如下: 

select * from db_table where id>5;

这条语句中, 锁住的范围是[5,+∞]。

相关标签: 数据库、mysql