一、锁的概述

在计算机中,锁是协调多个进程或线程并发访问某一资源的一种机制。

在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。

如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。

从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。

二、锁的分类

2.1 按数据操作的类型分类:

  • 读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响。

  • 写锁(排它锁):当前操作没有完成之前,它会阻断其他的写操作或读操作。

2.2 按数据操作的粒度分:

  • 表锁:操作时,会锁定整个表。开销小,加锁快;不会出现死锁;锁定力度大,发生锁冲突概率高,并发度最低。

  • 行锁:操作时,会锁定当前操作的表的某些行。开销大,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高。

  • 页锁:操作时,会锁定当前操作的表的某些页。开销和加锁速度介于表锁和行锁之间;会出现死锁;锁定粒度介于表锁和行锁之间,并发度一般。

很难笼统地说哪种锁更好,只能就具体应用的特点来说哪种锁更合适!

仅从锁的角度来说,表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用,如Web 应用;而行级锁则更适合于有大量按索引条件并发更新少量不同数据,同时又有并查询的应用,如一些在线事务处理(OLTP)系统。

三、MySQL的锁

相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。InnoDB存储引擎支持行锁和表锁,MEMORY和MyISAM等存储引擎只支持表锁。

3.1 MyISAM的表锁

MyISAM存储引擎在执行查询语句(SELECT),会自动给涉及的所有表加读锁,在执行更新操作(UPDATE、DELETE、INSERT等),会自动给涉及的表加写锁,这个过程并不需要用户干预。

为了方便演示,我们利用系统提供的显式加锁指令:

  • 读锁:lock table table_name read;

  • 写锁:lock table table_name write;

  • 解锁:unlock tables;

建立一个MyISAM存储引擎的表,并插入一些数据:

create table tb_myisam(
id INT AUTO_INCREMENT,
name VARCHAR(30),
age INT,
PRIMARY KEY(id)) engine=myisam;insert into tb_myisam(name,age) value('zhang3',20);
insert into tb_myisam(name,age) value('li4',21);
insert into tb_myisam(name,age) value('wang5',22);

3.1.1 在两个会话终端来演示MyISAM的读锁:

3.1.2 演示MyISAM的写锁:

3.2 InnoDB的表锁和行锁

InnoDB存储引擎在执行更新操作(UPDATE、DELETE、INSERT等),会自动给涉及的表或行加写锁。

InnoDB存储引擎对于普通SELECT语句,不会加任何锁。如果读的数据正在执行UPDATE或DELETE操作,这时读操作不会等待写锁的释放,而是直接读取该数据的快照,具体读取那份快照数据,和系统的隔离级别有关。

对于SELECT语句,系统提供了显式加锁指令:

  • 读锁:select * from table_name where ... lock in share mode;

  • 写锁:select * from table_name where ... for update;

建立一个MyISAM存储引擎的表,并插入一些数据:

create table tb_innodb (
id INT AUTO_INCREMENT,
name VARCHAR(30),
age INT,
PRIMARY KEY(id)) engine=innodb;insert into tb_innodb(name,age) value('zhang3',20);
insert into tb_innodb(name,age) value('li4',21);
insert into tb_innodb(name,age) value('wang5',22); 

为了方便演示,我们需要关闭系统的自动提交

3.2.1 演示InnoDB表的读锁:

3.2.2 演示InnoDB表的写锁:

3.2.3 演示InnoDB行的读锁:

3.2.4 演示InnoDB行的写锁:

KunlunDB项目已开源

【GitHub:】
https://github.com/zettadb

【Gitee:】
https://gitee.com/zettadb

END

举例解释一下MySQL的表锁和行锁相关推荐

  1. Mysql之数据库锁(表锁和行锁)详解

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

  2. mysql锁(全局锁、表锁、行锁、页锁、排他锁、共享锁)

    mysql锁 简介 数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则. MySQL数据库由于其自身架构的特点,存在多种数据存储引擎,每种存储 ...

  3. MySQL表锁、行锁、排它锁和共享锁

    文章目录 一.事务隔离机制的选择 二.表级锁&行级锁 三.排它锁(Exclusive)和共享锁(Shared) 1. 测试不同事务之间排它锁和共享锁的兼容性 2. 测试行锁加在索引项上 四.串 ...

  4. MySQL中的锁(表锁、行锁)

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

  5. mysql某个表被行锁了_MySQL中的锁(表锁、行锁)

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

  6. mysql 并发 锁表_MySQL中的锁(表锁、行锁) 并发控制锁

    https://github.com/MrLining/mysql/wiki/MySQL%E4%B8%AD%E7%9A%84%E9%94%81%EF%BC%88%E8%A1%A8%E9%94%81%E ...

  7. 【MySQL】MySQL 数据库表锁和行锁

    文章目录 1.概述 1. 全局锁 1.1. 全局锁的特点 1.2. 全局锁的作用(全库逻辑备份) 2.表级锁 2.1. 表锁 2.1.1. 特点 2.2. MDL元数据锁(metadata lock) ...

  8. mysql 表级别的锁和行级别的_MySQL 表锁和行锁机制

    案例分析 目前,MySQL常用的存储引擎是InnoDB,相对于MyISAM而言.InnoDB更适合高并发场景,同时也支持事务处理.我们通过下面这个案例(坑),来了解行锁和表锁. 业务:因为订单重复导入 ...

  9. h5棋牌源码中MySQL中的锁(表锁、行锁)

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

最新文章

  1. 全国计算机等级考试评卷、成绩处理和证书管理办法
  2. 企业级区块链现状研究报告:小企业的投资总额是大企业的28倍
  3. linux命令查看几位,Linux每周几个命令(一)--查找篇
  4. stm32F105的can2问题
  5. html中亮度怎么写,html – 使用CSS更改背景的亮度
  6. Leetcode之打印链接的倒数第K个节点
  7. java记录目录树_Java记录
  8. 数据结构基础 后序遍历和中序遍历还原二叉树
  9. oracle删除schema下所有对象,清空Schema中所有对象的步骤
  10. 使用BootStrap制作网页页面
  11. linux dsp开发环境,在ubuntu上搭建uclinux开发环境(转载)--- 第二篇
  12. php随机点名代码怎么做,html座位表随机点名的实例代码
  13. 数字逻辑educoder实训项目 logisim实现 交通灯系统设计
  14. 隔壁小王的shell命令1
  15. 如何回答「为什么想来我们公司」【面试核心问题2】
  16. 加速你的安卓模拟器,让开发更迅速
  17. 韦东山嵌入式第一期学习笔记DAY_3——7_1_裸机开发步骤简介
  18. 24、Java——银行存款取款系统(对象+集合)
  19. java-EasyExcel导出excel设置单元格为文本格式(含代码)
  20. graphics.h头文件_C语言图形(graphics.h头文件功能和示例)

热门文章

  1. Maya2017无法导出fbx文件
  2. Oracle基础知识总结
  3. java-php-python-ssm雷士灯具管理系统计算机毕业设计
  4. Android问题集锦之四十六:改包名后出现Error type 3
  5. LA4670 Dominating Patterns[AC自动机]
  6. vue实现全屏登录视频背景并适配浏览器窗口大小
  7. w10如何修改服务器地址,win10怎么设置服务器地址
  8. C/C++获取安卓手机IMEI编号demo
  9. css删格系统填充颜色,CSS 栅格系统
  10. 阴阳师人数最多的服务器,阴阳师堪称全服务器最佛系的神级玩家