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. zTree根据json选中节点,并且设置其他节点不可选

    首先,在适配目录树时,使用checkbox形式,配置代码如下: var settingCatalog = { check:{ enable: true }, data:{ simpleData:{ e ...

  2. angular路由守卫

     路由守卫是指当用户满足了某些要求之后才可以离开或者进入某个页面或者场景的时候使用.比如说只有当用户填写了用户名和密码之后才可以进入首页,比如说用户离开某个页面时明月保存信息提示用户是否保存信息后再离 ...

  3. Python内置函数(34)——filter

    英文文档: filter(function, iterable) Construct an iterator from those elements of iterable for which fun ...

  4. Mego开发文档 - 事务

    事务 事务允许以原子方式处理多个数据库操作.如果事务已提交,则所有操作都已成功应用于数据库.如果事务回滚,则没有任何操作应用于数据库. 默认行为 默认情况下,如果数据库提供程序支持事务,则单次的提交操 ...

  5. 新概念英语(1-111)The most expensive model

    Lesson 111 The most expensive model 最昂贵的型号 Listen to the tape then answer this question. Can Mr. Fri ...

  6. angular2 学习笔记 ( Rxjs, Promise, Async/Await 的区别 )

    Promise 是 ES 6 Async/Await 是 ES 7 Rxjs 是一个 js 库 在使用 angular 时,你会经常看见这 3 个东西. 它们都和异步编程有关,有些情况下你会觉得用它们 ...

  7. Spring Security入门(2-3)Spring Security 的运行原理 4 - 自定义登录方法和页面

    参考链接,多谢作者: http://blog.csdn.net/lee353086/article/details/52586916 http元素下的form-login元素是用来定义表单登录信息的. ...

  8. kafka之zookeeper 节点

    1.zookeeper 节点 kafka 在 zookeeper 中的存储结构如下图所示:

  9. JSON(四)——异步请求中前后端使用Json格式的数据进行交互

    json格式的数据广泛应用于异步请求中前后端的数据交互,本文主要介绍几种使用场景和使用方法. 一,json格式字符串 <input type="button" id=&quo ...

  10. 命名参数名(含*args , * *kw的区别)

    要限制关键字参数的名字,就可以用命名关键字参数 # coding=utf-8 # 命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数.调用方式如下 def person(name, ...