MySQL--表锁

从对数据操作的类型来分
读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响。
写锁(排他锁):当前写操作没有完成前,它会阻断其他写锁和读锁。
从对数据操作的粒度来分

三锁:
表锁(偏读)
偏向MyISAM存储引擎,开销下,加锁快,无死锁;锁定粒度大,发生锁冲突的概率最高,并发读最低。
给mylock表上读锁,给book表上写锁

lock table mylock read,book write;

查看表锁情况

show open tables;

在这里插入图片描述
解锁:

unlock tables;

在这里插入图片描述
分析表锁定
可以通过检查table_lock_waited和table_locks_immediate状态变量来分析系统上的表锁定。
table_locks_immediate:产生表即锁定的次数,表示可以立即获取锁的查询次数,每立即获取锁值加1。
table_locks_wait:出现表级锁定争用而发生等待的次数(不能立即获取锁的次数,每等待一次锁值加1),此值高则说明存在着较严重的表级锁争用情况。
在这里插入图片描述

案例–给表上读锁
表结构

CREATE TABLE `mylock` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
CREATE TABLE `book` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

在这里插入图片描述
如图中,两个控制台均可读取到数据,读锁时共享的,锁表的那个控制台无法更新信息,更新的话控制台会报错,同时也无法读取其他表的信息,控制台同样会报错,另外一个控制台可以读取锁定表的信息,但是无法更新表中的信息,控制台会阻塞,
开始解锁:

update mylock set name='b' where id=1;

在这里插入图片描述
给表上写锁:
在这里插入图片描述
如图中,第一个控制台给表上写锁,自己能查询和更新被锁表中的数据,第二个控制台中尝试去查询锁表中的数据,发现控制台会阻塞,第三个表中尝试去更新锁表中的数据,结果控制台同样阻塞。
解锁后,阻塞的控制台变为正常执行。
总结:读锁会阻塞写,但是不会阻塞读,而写锁则会把读和写都阻塞。
MyISAM的读写锁调度是写优先,这也是MyIsam不适合做写主表的引擎,因为写锁后,其他线程不能做任务操作,大量的更新是查询很难得到锁,从而造成永久阻塞。

猜你喜欢

转载自blog.csdn.net/BtWangZhi/article/details/86683396