MySQL性能优化(八)-- 锁机制之表锁

栏目: 数据库 · 发布时间: 6年前

内容简介:下面我们模拟两个用户,即两个线程连接数据库,开启两个xsheel窗口,连接到mysql:答案是可以的。答案也是可以的。

1.读锁

create table lock_one(
     id int primary key auto_increment,
     col int
)engine=myisam;

insert into lock_one(col) values (1);
insert into lock_one(col) values (2);
insert into lock_one(col) values (3);
复制代码

下面我们模拟两个用户,即两个线程连接数据库,开启两个xsheel窗口,连接到mysql:

  1. 在会话1中对lock_one表增加读锁
lock table lock_one read;
复制代码
  1. 在当前会话(会话1)中是否可以select该表呢,也就是说对 lock_one增加了读锁后,在当前会话中是否可以读呢?
select * from lock_one;
复制代码

答案是可以的。

  1. 在另一个会话中(会话2)是否可以select该表呢?

答案也是可以的。

  1. 那么在会话1中是否可以查询其他表呢?

例如,查询 users表:select * from users;

MySQL性能优化(八)-- 锁机制之表锁

我们发现是不可以查询其他表的,这是因为当前会话已经对lock_one表加上了锁,即当前线程锁住了lock_one表,只可以操作lock_one表,就不可以查询其他的表。

  1. 问题来了,会话2是否可以查询其他表呢?
select * from users;
复制代码
MySQL性能优化(八)-- 锁机制之表锁

我们发现是可以的。因为会话2和会话1是没有关系的,会话2查询会话1锁住的表都可以,查询没有锁住的 肯定是可以的。

  1. 在会话1中是否可以更新(增删改)锁住的lock_one表呢?
update lock_one set col=66 where id=1;
复制代码
MySQL性能优化(八)-- 锁机制之表锁

发现是不可以的,因为我们对 lock_one表加了 读锁,所以是不可以 进行写操作的。

  1. 在会话2中是否可以更新(增删改)会话1中锁住的lock_one表呢?
MySQL性能优化(八)-- 锁机制之表锁

我们发现是没有执行结果的,也就是说 正在等待更新,在阻塞等待中。因为我们在会话1中对lock_one中增加了读锁,其他人只有读的操作,没有写的操作。

  1. 在会话1中 对lock_one进行解锁时,会话2中的更新(增删改)操作 就会立即执行。
MySQL性能优化(八)-- 锁机制之表锁

2.写锁

  1. 在会话1中对lock_one表增加写锁
lock table lock_one write;
复制代码
  1. 在会话1中查询该表
select * from lock_one;
复制代码

我们发现是可以的。

  1. 在会话2中查询该表
MySQL性能优化(八)-- 锁机制之表锁

我们发现是没有执行结果的,也就是说 处于阻塞状态。因为写锁是排它锁,其他用户线程不可以读取当前锁住的表,只有解锁之后 其他用户线程才可以执行select

MySQL性能优化(八)-- 锁机制之表锁
  1. 在会话1中对lock_one进行写锁后,会话1会否可以查询其他表呢?
select * from users;
复制代码
MySQL性能优化(八)-- 锁机制之表锁

我们发现是不可以的。道理和读锁的时候一样,当前会话已经对lock_one表加上了锁,即当前线程锁住了lock_one表,只可以操作lock_one表,就不可以查询其他的表。

  1. 那么在会话2中是否可以查询其他表呢?

答案肯定是可以的。因为之和锁的表有关系,和其他表没有任何关系。

  1. 在会话1中是否可以进行写(增删改)操作呢?

答案一定是可以的。因为会话1对lock_one表进行了写锁操作,也就是只可以写。

  1. 在会话2中是否可以进行写(增删改)操作呢?
MySQL性能优化(八)-- 锁机制之表锁

我们发现是不可以的。因为写锁是排它锁,也就是只可以当前线程操作锁住的表,其他用户线程需要等到解锁之后才可以操作该表。

MySQL性能优化(八)-- 锁机制之表锁

3.总结

  1. 甲对表A加了读锁
  • 甲对表A可以执行读(查询)操作,但不可以执行写(增删改)操作
  • 甲对其他表不可以执行读写(增删改查)操作
  • 乙对表A可以执行读(查询)操作,但不可以执行写(增删改)操作
  • 乙对其他表可以执行读写(增删改查)操作
MySQL性能优化(八)-- 锁机制之表锁
  1. 甲对表A加了写锁
  • 甲对表A可以执行读写(增删改查)操作
  • 甲对其他表不可以执行读写(增删改查)操作
  • 乙对表A不可以执行读写(增删改查)操作
  • 乙对其他表可以执行读写(增删改查)操作
MySQL性能优化(八)-- 锁机制之表锁
欢迎关注我的公众号,第一时间接收最新文章~ 搜索公众号:

或者 扫描下方二维码:


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Measure What Matters

Measure What Matters

John Doerr / Portfolio / 2018-4-24 / GBP 19.67

In the fall of 1999, John Doerr met with the founders of a start-up he’d just given $11.8 million, the biggest investment of his career. Larry Page and Sergey Brin had amazing technology, entrepreneur......一起来看看 《Measure What Matters》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换