測試環境
- ubuntu18.04
- mysql Ver 14.14 Distrib 5.7.35, for Linux (x86_64) using EditLine wrapper
准備工作
- 安裝啟動MySQL
sudo apt-get install mysql-server
sudo mysql_secure_installation // 配置,密碼設置123456
status mysql.service // 查看MySQL服務狀態,正常如下圖
- 創建數據庫,創建用戶
sudo mysql -uroot -p // 以root用戶權限登錄
CREATE DATABASE wasidb; // 創建數據庫
GRANT ALL PRIVILEGES ON wasidb.* TO A@"%" IDENTIFIED BY "123456"; // 創建用戶A
GRANT ALL PRIVILEGES ON wasidb.* TO B@"%" IDENTIFIED BY "123456"; // 創建用戶B
- 開三個shell窗口,分別輸入
sudo mysql -uroot -p123456 // 登錄root,方便查看數據庫信息
sudo mysql -uA -p123456 // 登錄A
sudo mysql -uB -p123456 // 登錄B
use wasidb;
測試
- 建表,注意一定要建索引,網上的說表鎖的都是因為沒建索引
CREATE TABLE `test` (
`id` int(11) NOT NULL,
`data` int(11) DEFAULT NULL,
PRIMARY KEY(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
- 設置隔離級別
set session transaction isolation level serializable;
select @@session.transaction_isolation;
- root用戶查看事務鎖語句
select * from information_schema.innodb_trx\G;
- 一個要注意的字段
trx_rows_locked // 事務行鎖數
-
支持並發讀
-
讀是加行鎖的
- 表初始情況
- 用戶A
- 鎖情況
- 用戶B
- 等值查詢的行鎖類型是record lock,不使用gap lock
- 表初始情況
- 用戶A
- 鎖情況
- 用戶B
- 范圍查詢的行鎖類型是next-key lock
- 表初始情況
- 用戶A
- 鎖情況,前開后閉的next-key lock 把5也鎖了
- 用戶B
- 寫,不知道怎么做的,有懂的可以在評論說說
-
表初始情況
-
用戶A
-
鎖情況①
-
用戶B①
-
用戶B②
-
鎖情況②,當用戶B進行插入時,顯示又鎖上了