本文主要針對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事務阻塞