1. 程式人生 > >Mysql-InnoDB鎖的最佳實踐

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: 斷言鎖
  1. Shared and Exclusive Locks Shared Locks: 用於select操作; Exclusive Locks: 用於update或delete操作 鎖的粒度: 表鎖------> 行鎖 ------> 共享/排他鎖 普通的行鎖, 太過獨斷, 導致讀讀都不能並行, 這個就有優化的空間; 因此共享/排他鎖應運而生, 執行規則如下 (1) 讀讀事物併發執行; (2) 先讀後寫, 寫會阻塞需要等待讀釋放鎖後才能得到鎖再執行; (3) 先寫後讀/寫, 寫鎖是獨自的, 其他的讀或者寫都會阻塞, 需要等待寫鎖釋放後才能得到鎖再執行;

  2. Intention Locks

  3. Record Locks

  4. Gap Locks

  5. Next-Key Locks

  6. Insert Intention Locks

  7. AUTO-INC Locks

  8. 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;
  1. 插入資料行會鎖表嗎? 開啟兩個事物會話, 交叉執行插入語句
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已提交的內容;