mysql-写阻塞

先说一下前提,我的mysql是使用的5.6版本,隔离级别是RR。

表结构

CREATE TABLE `t` (
  `id` int(11) NOT NULL,
  `c` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `t` VALUES ('0', '0');
INSERT INTO `t` VALUES ('20', '20');
INSERT INTO `t` VALUES ('25', '25');

一.先放两组SQL。c并没有索引

(1)begin;

update t set c=1 where c=0;

(2)begin;

insert into t values(1,1);

这个时候无论你先执行哪组语句,后面的语句都会阻塞,那么我们就分析一下原因。

二.分析原因

假设我们先执行(1)组,那么这个时候,update语句的原理都是先删除再插入,那么就有两种可能了,第一种是delete的时候会产生阻塞、第二种是insert的时候会产生阻塞,那就只能通过实际的操作来反应一下情况了。

我们使用如下SQL。

(1)begin;

delete from t where c=0;

(2)begin;

insert into t values(1,1);

这个时候已经产生了阻塞。那么找一下原因:

(1)delete语句会产生锁,由于c这个字段没有索引,所以无法直接对索引进行加锁,就会导致表锁。

(2)而这个时候,insert语句进来,就会等待表锁的释放。

(假设c这个字段有索引的话,那么c=0这一个条件就会让delete锁定索引,只要和insert不冲突就不会存在阻塞的情况)

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值