mysql insert锁分析

本文主要针对mysql中多事务下insert锁分析
环境:mysql:5.6,Navicat
先看下表结构,订单号是唯一索引

CREATE TABLE `order_info` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id',
  `order_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '订单号',
  `open_uid` varchar(32) NOT NULL DEFAULT '' COMMENT '用户uid',
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_order_id` (`order_id`),
  KEY `idx_open_uid` (`open_uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单表';
  1. 开启事务插入一条数据
START TRANSACTION;
INSERT into order_info(order_id,open_uid) VALUES (1,1);
  1. 再插入一条订单号相同的数据
START TRANSACTION;
INSERT into order_info(order_id,open_uid) VALUES (1,2);
  1. 查看当前执行的事务和状态
select * from information_schema.INNODB_TRX;


上图可知一个处于执行状态,一个处于阻塞状态

  1. 查询当前InnoDB事务锁的具体情况
select * from information_schema.INNODB_LOCKS;

在这里插入图片描述
上图可知2322事务获取了s(共享锁),2311获取x(排它锁)

  1. 查询锁等待的状况
select * from information_schema.INNODB_LOCK_WAITS;

在这里插入图片描述
上图可知2322被2311事务阻塞

由上可以总结出:发生唯一键冲突时,会获取行锁,并会伴随从S锁升级到X锁,其他有唯一键冲突的事务会阻塞。当把第一个事务提交(执行commit;)时,第二个事务就会立马报唯一键冲突,而不会阻塞了。当订单号不重复时,则第二个事务也就会立马执行,不会出现行锁以及阻塞的情况。

当有两个以上事务发生唯一键冲突时,第一个事务执行回滚操作(执行ROLLBACK;),其他事务会去请求排它锁(X锁),由于X锁与S锁互斥,其他事务(目前都持有S锁)都等待对方释放S锁。

发布了6 篇原创文章 · 获赞 7 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/m0_37300406/article/details/104106122