Mysql-InnoDB鎖的最佳實踐
Mysql自稱為世界上最收歡迎的開源(GPL協議)資料庫, 可以有效幫助企業構建高效能,高可用的應用程式; 其自身提高了兩種資料庫引擎MyISAM和InnoDB, 然後由於InnoDB支援事物及行級鎖, 因此被很多網際網路公司優先選用; 本篇博文主要介紹Mysql-InnoDB資料庫引擎中相關鎖的介紹和使用案例; (環境Mysql8.0)
簡介
InnoDB中鎖型別介紹
- Shared and Exclusive Locks: 共享和排他鎖
- Intention Locks: 意向鎖
- Record Locks: 記錄鎖
- Gap Locks: 間隙鎖
- Next-Key Locks: 臨建鎖
- Insert Intention Locks: 插入意向鎖
- AUTO-INC Locks: 自增鎖
- Predicate Locks for Spatial Indexes: 斷言鎖
-
Shared and Exclusive Locks Shared Locks: 用於select操作; Exclusive Locks: 用於update或delete操作 鎖的粒度: 表鎖------> 行鎖 ------> 共享/排他鎖 普通的行鎖, 太過獨斷, 導致讀讀都不能並行, 這個就有優化的空間; 因此共享/排他鎖應運而生, 執行規則如下 (1) 讀讀事物併發執行; (2) 先讀後寫, 寫會阻塞需要等待讀釋放鎖後才能得到鎖再執行; (3) 先寫後讀/寫, 寫鎖是獨自的, 其他的讀或者寫都會阻塞, 需要等待寫鎖釋放後才能得到鎖再執行;
-
Intention Locks
-
Record Locks
-
Gap Locks
-
Next-Key Locks
-
Insert Intention Locks
-
AUTO-INC Locks
-
Predicate Locks for Spatial Indexes
案例介紹
查詢當前資料庫版本
select version();
查詢當前session的事物級別
select @@transaction_isolation;
列出所連mysql-server中的所有Databases
show databases;
選用schema即Database (test)
use test
列出當前schema下的所有tables
show tables;
在包含自增主鍵的表裡面進行增刪改操作
建立使用者測試的使用者表
CREATE TABLE `test`.`t_user` (
`id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(45) NOT NULL,
`sex` TINYINT NOT NULL,
PRIMARY KEY (`id`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;
- 插入資料行會鎖表嗎? 開啟兩個事物會話, 交叉執行插入語句
A: START TRANSACTION;
B: START TRANSACTION;
A: INSERT INTO T_USER (name, sex) values ('Hinsteny', 0);
A: SELECT * FROM T_USER;
B: SELECT * FROM T_USER;
B: INSERT INTO T_USER (name, sex) values ('Hisoka', 0);
B: SELECT * FROM T_USER;
B: COMMIT;
B: SELECT * FROM T_USER;
A: SELECT * FROM T_USER;
A: COMMIT;
A: SELECT * FROM T_USER;
雖然事物A先開啟, 但是後開啟的B事物並不會阻塞, 然後在AB各自事物內都讀不到非本身事物的修改內容; 即使B事物提交後, A事物內部還是不能讀到事物B已提交的內容;