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,+∞]。
下一篇: Centos添加永久静态路由方法