MySQL事務隔離級別為串行化的鎖問題(不是表鎖!!!)


測試環境

  • ubuntu18.04
  • mysql Ver 14.14 Distrib 5.7.35, for Linux (x86_64) using EditLine wrapper

准備工作

  1. 安裝啟動MySQL
sudo apt-get install mysql-server
sudo mysql_secure_installation   // 配置,密碼設置123456


status mysql.service             // 查看MySQL服務狀態,正常如下圖

  1. 創建數據庫,創建用戶
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
  1. 開三個shell窗口,分別輸入
sudo mysql -uroot -p123456        // 登錄root,方便查看數據庫信息
sudo mysql -uA -p123456           // 登錄A
sudo mysql -uB -p123456           // 登錄B
use wasidb;

測試

  1. 建表,注意一定要建索引,網上的說表鎖的都是因為沒建索引
CREATE TABLE `test` (
  `id` int(11) NOT NULL,
  `data` int(11) DEFAULT NULL,
  PRIMARY KEY(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
  1. 設置隔離級別
set session transaction isolation level serializable;
select @@session.transaction_isolation;

  1. root用戶查看事務鎖語句
select * from information_schema.innodb_trx\G;
  • 一個要注意的字段
trx_rows_locked        // 事務行鎖數
  1. 支持並發讀

  2. 讀是加行鎖的

  • 表初始情況
  • 用戶A
  • 鎖情況
  • 用戶B
  1. 等值查詢的行鎖類型是record lock,不使用gap lock
  • 表初始情況
  • 用戶A
  • 鎖情況
  • 用戶B
  1. 范圍查詢的行鎖類型是next-key lock
  • 表初始情況
  • 用戶A
  • 鎖情況,前開后閉的next-key lock 把5也鎖了
  • 用戶B
  1. 寫,不知道怎么做的,有懂的可以在評論說說
  • 表初始情況

  • 用戶A

  • 鎖情況①

  • 用戶B①

  • 用戶B②

  • 鎖情況②,當用戶B進行插入時,顯示又鎖上了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM