锁是计算机协调多个进程或纯线程并发访问某一资源的机制。而表锁由MySQL Server 实现,一般在执行DDL语句时会对整个表进行加锁,比如说ALTER TABLE等操作。在执行SQL语句时,也可以明确指定对某个表进行加锁。本文我们就来重点讲述一下MySQL表锁。

表锁使用的是一次性锁技术,也就是说,在会话开始的地方使用 lock 命令将后续需要用到的表都加上锁,在表释放前,只能访问这些加锁的表,不能访问其他表,直到最后通过 unlock tables 释放所有表锁。除了使用 unlock tables 显示释放锁之外,会话持有其他表锁时执行lock table 语句会释放会话之前持有的锁;会话持有其他表锁时执行 start transaction 或者 begin 开启事务时,也会释放之前持有的锁。

由于MyISAM存储引擎使用的锁定机制完全是由MySQL提供的表级锁定实现,所以下面我们将以MyISAM存储引擎作为示例存储引擎。

1.MySQL表级锁的锁模式

MySQL的表级锁有两种模式:表共享读锁(Table Read Lock)和表独占写锁(Table Write Lock)。锁模式的兼容性:

对MyISAM表的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求;

对MyISAM表的写操作,则会阻塞其他用户对同一表的读和写操作;

MyISAM表的读操作与写操作之间,以及写操作之间是串行的。当一个线程获得对一个表的写锁后,只有持有锁的线程可以对表进行更新操作。其他线程的读、写操作都会等待,直到锁被释放为止。

2.如何加表锁

MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作(UPDATE、DELETE、INSERT等)前,会自动给涉及的表加写锁,这个过程并不需要用户干预,因此用户一般不需要直接用LOCK TABLE命令给MyISAM表显式加锁。显式加锁基本上都是为了方便而已,并非必须如此。给MyISAM表显示加锁,一般是为了一定程度模拟事务操作,实现对某一时间点多个表的一致性读取。例如,有一个订单表orders,其中记录有订单的总金额total,同时还有一个订单明细表order_detail,其中记录有订单每一产品的金额小计subtotal,假设我们需要检查这两个表的金额合计是否相等,可能就需要执行如下两条SQL:SELECT SUM(total) FROM orders;

SELECT SUM(subtotal) FROM order_detail;

这时,如果不先给这两个表加锁,就可能产生错误的结果,因为第一条语句执行过程中,order_detail表可能已经发生了改变。因此,正确的方法应该是:

LOCK tables orders read local,order_detail read local;

SELECT SUM(total) FROM orders;

SELECT SUM(subtotal) FROM order_detail;

Unlock tables;

3.MyISAM表锁优化建议

对于MyISAM存储引擎,虽然使用表级锁定在锁定实现的过程中比实现行级锁定或者页级锁所带来的附加成本都要小,锁定本身所消耗的资源也是最少。但是由于锁定的颗粒度比较到,所以造成锁定资源的争用情况也会比其他的锁定级别都要多,从而在较大程度上会降低并发处理能力。所以,在优化MyISAM存储引擎锁定问题的时候,最关键的就是如何让其提高并发度。由于锁定级别是不可能改变的了,所以我们首先需要尽可能让锁定的时间变短,然后就是让可能并发进行的操作尽可能的并发。

从上面对MySQL表锁的描述我们不难看出,表锁具有开销小,加锁快的特性,而且不会出现死锁,锁定粒度大,发生锁冲突的概率最高,并发度低。当然,表锁只是MySQL里面的一种大的锁的类别,还有行锁。想要了解行锁的小伙伴,锁定本站的MySQL教程,里面有着详细的讲解。

mysql锁描述正确的是_MySQL表锁详解相关推荐

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

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

  2. mysql myisam表分区_MySQL 表分区详解MyiSam引擎和InnoDb 区别(实测)

    一.什么是表分区 通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了. 如:某用户表的记录超过了1000万条,那么就可以根据入库日期将表分区,也可以根据所在地将表 ...

  3. mysql中修改表结构语法_MySQL表结构修改详解

    MySQL修改表的语法 ========================= 增加列[add 列名] ========================= ①alter table 表名 add 列名 列 ...

  4. mysql的锁机制(读锁,写锁,表锁,行锁,悲观锁,乐观锁,间隙锁)

    读锁和写锁 介绍 MyISAM表锁中的读锁和写锁 读锁(共享锁S): 对同一个数据,多个读操作可以同时进行,互不干扰.加锁的会话只能对此表进行读操作,其他会话也只能进行读操作.MyISAM的读默认是加 ...

  5. mysql多表查询详解_MySQL多表查询详解上

    时光在不经意间,总是过得出奇的快.小暑已过,进入中暑,太阳更加热烈的绽放着ta的光芒,...在外面被太阳照顾的人们啊,你们都是勤劳与可爱的人啊.在房子里已各种姿势看我这篇这章的你,既然点了进来,那就由 ...

  6. MySQL锁、事务隔离级别、MVCC机制详解、间隙锁、死锁等

    一. 简介 1. 锁定义 锁是计算机协调多个进程或线程并发访问某一资源的机制. 在数据库中,除了传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供需要用户共享的资源.如何保证数据并 ...

  7. MySQL 表分区详解MyiSam引擎和InnoDb 区别(实测)

    MySQL 表分区详解MyiSam引擎和InnoDb 区别(实测) 一.什么是表分区 通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了. 如:某用户表的记录超过 ...

  8. mysql 社区版 innodb_MySQL 表分区详解MyiSam引擎和InnoDb 区别(实测)

    MySQL 表分区详解MyiSam引擎和InnoDb 区别(实测) / --------------------         写在最前面            ------------------ ...

  9. 简述mysql完全备份过程_【SQL】MySQL之使用mysqldump全备份及恢复过程详解_MySQL

    mysqldump bitsCN.com [SQL]MySQL之使用mysqldump全备份及恢复过程详解 [目标]使用mysqldump做全备,结合mysql自带的binlog功能实现增量备份 为了 ...

最新文章

  1. java web 调用hadoop_Java及Web程序调用hadoop2.6
  2. SpringCloud系列一:SpringCloud的简介和架构
  3. 深层上下文化的单词表示
  4. C语言中Static和Const关键字的的作用
  5. php代码清除空格注解,PHP文件去掉PHP注释空格的函数分析(PHP代码压缩)
  6. produces在@requestMapping中的使用方式和作用
  7. 球球大作战体验服找不到团战服务器6,球球大作战常见问题汇总 新版本问题解决方法...
  8. php class使用方法,php的类使用方法问题
  9. 深度学习的实用层面 —— 1.13 梯度检验
  10. 一个真实的案例———HPUX调整LUN大小识别更改
  11. python操作excel模板_Python Excel模板读写,维护公式和格式
  12. Kali中搭建vulhub时镜像git失败
  13. windows phone 7 学习笔记 五 TileSample
  14. Android开发,MapBox地图详细介绍、使用、部分功能实现(初始化、标记、定位、styleurl)
  15. 什么是CMMI能力成熟度模型?企业为什么要做?
  16. linux opendir路径_Linux目录遍历opendir()
  17. lg空调代码大全解决_LG空调故障代码大全-kg空调维修-lg空调维修手册
  18. 互联网进入网盘新时代
  19. hikaricp mysql_JAVA连接数据库 #03# HikariCP
  20. C51_将按键次数写入AT24C02,再读出送LCD显示

热门文章

  1. RTX2080ti显卡+win10+安装Tensorflow-gpu
  2. 生信小白学习日记Day2-2——NGS基础 NGS分析
  3. 乳山金岭中学校计算机老师,乳山市金岭中学
  4. Unity3D技术开发之战争迷雾效果
  5. linux命令行was集群启停,通用服务启停shell脚本
  6. Java DecimalFormat 格式化数字,取2位小数,按位取小数,按要求格式化小数 float,double,int,等类型都支持
  7. 用C#识别图像中的文字_MODI OCR
  8. Happy 2004(代码+积性函数扩展)
  9. 论文阅读(11) 操纵涡环来提高机动性 (2015)
  10. 三星android怎么解锁,三星S7解锁教程_三星S7怎么Bootloader解锁(附教程)_玩游戏网...