什么是mysql可重复读_MySQL选用可重复读之前一定要想到的事情

本文探讨了MySQL在可重复读隔离级别下,如何因执行计划的不同而产生不同的锁行为。通过实验展示了当使用`FOR UPDATE`查询时,全表扫描会导致全索引锁定,而索引范围扫描则避免了这一问题。这提醒我们在设计SQL查询时,需考虑其可能带来的锁影响。
摘要由CSDN通过智能技术生成

MySQL选用可重复读之前一定要想到的事情

MySQL在可重复读隔离级别下,可能出现全表的排他锁.

之前并没有找到一个合理的解释.

实验数据和环境

CREATE TABLE t (

a int(11) NOT NULL,

b int(11) DEFAULT NULL,

PRIMARY KEY (a),

KEY b (b)

) ENGINE=InnoDB;

INSERT INTO t VALUES

(10,2),

(20,2),

(30,4),

(40,4),

(50,6),

(60,6);

环境如下图所示:

f3077d19897af1ce7e7f671497d54425.png

根据前文的实验,我们可以看到MySQL加锁与隔离级别,是否主键索引,是否唯一索引,是否无索引相关。

除了上面的条件,加锁和执行计划还是有关系的。

比如下面的语句会导致所有的主键索引,二级索引与间隙上锁.

select * from t where b<=2 for update;

(3 lock struct(s), heap size 376, 13 row lock(s))

是因为他的执行计划

8d094ef41aeeae77483ca84985b18c1f.png

他采用了全扫描二级索引,所以对全部的二级索引以及对应的主键索引上锁,并且锁定了所有的间隙.可是非常可怕的。

------------------------------------------------------------------------------------------------

但是如果是下面的SQL语句,就不会有锁定全部索引与间隙的问题了.

select * from t where b<=4 for update;

开启另外一个终端输入Insert语句,没有受到任何影响.

mysql> insert into t select 70,6;

Query OK, 1 row affected (0.00 sec)

Records: 1 Duplicates: 0 Warnings: 0

这两个SQL语句在同样的环境下(同样的隔离级别,主键索引和二级索引),仅仅是因为查询的值不一样,却造成了不同的加锁情况,主要是因为执行计划不同,

第二个SQL的执行计划是索引范围扫描,所以不会锁定全部的二级索引与关联的主键索引.

8cf7f0b093c3ff3f84fda63e77de4df9.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值