Mysql 系列文章主页

===============

1 准备数据

1.1 建表

1.1.1 建立 Employee表

DROP TABLE IF EXISTS employee;
CREATE TABLE IF NOT EXISTS employee (
id INT PRIMARY KEY auto_increment,
name VARCHAR(40),
dept_id INT
)engine myisam;

1.1.2 建立 Department 表

DROP TABLE IF EXISTS department;
CREATE TABLE IF NOT EXISTS department (
id INT PRIMARY KEY auto_increment,
name VARCHAR(40)
)engine myisam;

1.1.3 注意:上述两张表的存储引擎都是 MyISam

1.2 插入数据

INSERT INTO employee(name, dept_id) VALUES('Alice', 1);
INSERT INTO employee(name, dept_id) VALUES('Bob', 1);
INSERT INTO department(name) VALUES('RD');

2 测试

2.1 给 Employee 表加上读锁

LOCK TABLE employee READ; 

2.2 查询 Employee 表

2.2.1 当前会话(终端、命令行窗口)

注意:当前会话是指执行了上面的 LOCK TABLE employee READ 语句的会话(窗口、命令行);在我的例子中,是白色背景。

SELECT * FROM employee; 

2.2.2 其它会话(终端、命令行窗口)

注意:新开一个会话窗口;在我的例子中,是黑色背景。

2.2.3 结论

可以看到,加了读锁后,当前会话和其它会话都可以进行读操作,即:读锁对于读操作共享。

2.3 更新 Employee 表

2.3.1 当前会话

UPDATE employee SET name = 'Alice02' WHERE id = 1;

2.3.2 其它会话

结果:被挂起、阻塞(上图)

接下来,在‘当前会话’中执行 UNLOCK TABLES 命令解除锁定(上图)

解除锁定后,‘其它会话’中的更新语句马上得到执行;可以看到,耗时 1 min 5.11 sec(上图)

2.3.3 结论

对于更新操作:

  • 当前会话不能更新(理解:加了一把读锁,当然不能进行写(更新)操作啦)
  • 其它会话必须等到当前会话解除锁定后才能进行更新,否则一直挂起(毕竟,‘当前会话’加得有锁,‘其它会话’肯定不能写入嘛)

2.4 读其它表

2.4.0 准备

提示:‘当前会话’需要再次锁住 Employee 表(因为上面执行了 UNLOCK TABLES)

LOCK TABLE employee READ;

2.4.1 当前会话

SELECT * FROM department;

2.4.2 其它会话

2.4.3 结论

对于其它表的读取操作:

  • 当前会话不能读取(Department 表没有被锁定,不能读取)
  • 其它会话可以正常读取

3 结论

读锁,对于当前会话 (Owner) 来说,可以读取锁住的表、但不能更新,也不能读取其它表;

对于其它会话 (Other) 来说,可以读取锁住的表、更新会被阻塞,可以正常读取其它表;

读锁对于读操作共享;

Mysql锁机制--读锁的更多相关文章

  1. Mysql锁机制介绍

    Mysql锁机制介绍 一.概况MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking ...

  2. 对mysql锁机制的学习

    1.对于mysql学习,经常翻看一些博客,论坛,好像或多或少有mysq锁机制的学习与总结,所以今天有必要 对mysql锁机制的一些个人的总结,以便以后深入的学习. 2.学习这件事,从来都是“深入浅出” ...

  3. mysql锁机制(转载)

    锁是计算机协调多个进程或线程并发访问某一资源的机制 .在数据库中,除传统的 计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所 ...

  4. 再谈mysql锁机制及原理—锁的诠释

    加锁是实现数据库并发控制的一个非常重要的技术.当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁.加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更 ...

  5. mysql锁机制和事务隔离

    mysql事务 1.InnoDB事务原理 事务(Transaction)是数据库区别于文件系统的重要特性之一,事务会把数据库从一种一致性状态转换为另一种一致性状态. 在数据库提交时,可以确保要么所有修 ...

  6. (三)MySQL锁机制 + 事务

    转: (三)MySQL锁机制 + 事务 表锁(偏读) 偏向MyISAM存储引擎.开销小,加锁快,无死锁,锁定粒度大,发生锁冲突的概率最高,并发最低. 查看当前数据库中表的上锁情况,0表示未上锁. sh ...

  7. Mysql锁机制--索引失效导致行锁变表锁

    Mysql 系列文章主页 =============== Tips:在阅读本文前,最好先阅读 这篇(Mysql锁机制--行锁)文章~ 在上篇文章中,我们看到InnoDB默认的行锁可以使得操作不同行时不 ...

  8. mysql锁机制详解

    前言 大概几个月之前项目中用到事务,需要保证数据的强一致性,期间也用到了mysql的锁,但当时对mysql的锁机制只是管中窥豹,所以本文打算总结一下mysql的锁机制. 本文主要论述关于mysql锁机 ...

  9. mysql锁机制 读书笔记

    目录 MySQL锁机制 1.什么是锁 2.lock与latch 3.InnoDB存储引擎中的锁 3.1锁的类型 3.2 一致性非锁定读 3.3 一致性锁定读 4 锁的算法 4.1行锁的3中算法 4.2 ...

随机推荐

  1. 儿童节,我们从零开始——Python入门资源推荐

    原创 2017-06-01 玄魂工作室 玄魂工作室 今天是六一儿童节,首先祝所有的小朋友身体健康,能永远生活在一个没有战争,没有压迫的世界里,永远快乐. 上一篇文章,很多人都对Python的各种书籍感 ...

  2. Python内置函数(30)——super

    英文文档: super([type[, object-or-type]]) Return a proxy object that delegates method calls to a parent ...

  3. 原生Ajax用法——一个简单的实例

    Ajax全名(Asynchronous(异步) JavaScript and XML )是可以实现局部刷新的 在讲AJax之前我们先用简单的实例说一下同步和异步这个概念 /*异步的概念(就是当领导有一 ...

  4. Docker加速器(阿里云)

    1. 登录阿里开发者平台: https://dev.aliyun.com/search.html,https://cr.console.aliyun.com/#/accelerator,生成专属链接 ...

  5. PHP7链接MySQL

    1 <?php $mysqli = new mysqli("localhost", "root", "123"); if($mysql ...

  6. JS中apply和call的应用和区别

    因为object没有某个方法,但是别的对象有,可以借助apply或call像别的对象借方法来操作. 猫吃鱼,狗吃肉,奥特曼打小怪兽. 有天狗想吃鱼了 猫.吃鱼.call(狗,鱼) 狗就吃到鱼了 猫成精 ...

  7. python Django之Ajax

    python Django之Ajax AJAX,Asynchronous JavaScript and XML (异步的JavaScript和XML),一种创建交互式网页应用的网页开发技术方案. 异步 ...

  8. from sys import argv

    from sys import argv  初学理解: sys 为内置模块,提供了许多函数和变量来处理 Python 运行时环境的不同部分.是固定的用法,不能自己随便写名字代替它,这行的作用就是要把用 ...

  9. Python的字典和JSON

    Python的字典和JSON在表现形式上非常相似 #这是Python中的一个字典 dic = { 'str': 'this is a string', 'list': [1, 2, 'a', 'b'] ...

  10. 00-深入理解C#读书笔记说明

    带着问题去看书 尝试着,根据每一小节,先列出大纲.然后根据自己原先的认知和理解以及不理解,对每一个小的chapter,我会先自我提问,带着问题去阅读,然后把我的理解以及不理解记录下来,对于错误的地方做 ...