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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章