本文主要针对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='订单表';
- 开启事务插入一条数据
START TRANSACTION;
INSERT into order_info(order_id,open_uid) VALUES (1,1);
- 再插入一条订单号相同的数据
START TRANSACTION;
INSERT into order_info(order_id,open_uid) VALUES (1,2);
- 查看当前执行的事务和状态
select * from information_schema.INNODB_TRX;
上图可知一个处于执行状态,一个处于阻塞状态
- 查询当前InnoDB事务锁的具体情况
select * from information_schema.INNODB_LOCKS;
上图可知2322事务获取了s(共享锁),2311获取x(排它锁)
- 查询锁等待的状况
select * from information_schema.INNODB_LOCK_WAITS;
上图可知2322被2311事务阻塞