按照锁的粒度来说,MySQL主要包含三种类型(级别)的锁定机制:
- 全局锁:锁的是整个database。由MySQL的SQL layer层实现的 - 表级锁:锁的是某个table。由MySQL的SQL layer层实现的 - 行级锁:锁的是某行数据,也可能锁定行之间的间隙。由某些存储引擎实现,比如InnoDB。
表级锁和行级锁的区别:
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低; 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高;
MySQL表级锁
由MySQL SQL layer层实现,一种是表锁。一种是元数据锁(meta data lock,MDL)。
MySQL 实现的表级锁定的争用状态变量:
show status like 'table%';
- table_locks_immediate:产生表级锁定的次数; - table_locks_waited:出现表级锁定争用而发生等待的次数;
表锁有两种表现形式:
表共享读锁(Table Read Lock) 表独占写锁(Table Write Lock)
手动增加表锁
lock table 表名称 read(write),表名称2 read(write),其他;
查看表锁情况
show open tables;
删除表锁
unlock tables;
实例:
CREATE TABLE mylock ( id int(11) NOT NULL AUTO_INCREMENT, NAME varchar(20) DEFAULT NULL, PRIMARY KEY (id) ); INSERT INTO mylock (id,NAME) VALUES (1, 'a'); INSERT INTO mylock (id,NAME) VALUES (2, 'b'); INSERT INTO mylock (id,NAME) VALUES (3, 'c'); INSERT INTO mylock (id,NAME) VALUES (4, 'd');