目录

一、表级锁,页级锁,行级锁

1、表级锁定(table-level)

2、行级锁定(row-level)

3、页级锁定(page-level)

二、锁定粒度大小比较


一、表级锁,页级锁,行级锁

1、表级锁定(table-level)

引擎 MyISAM , 理解为锁住整个表,可以同时读,写不行
     仅对指定的记录进行加锁,这样其它进程还是可以对同一个表中的其它记录进行操作。

详情:表级锁是MySQL各存储引擎中最大颗粒度的锁定机制。该锁定机制最大的特点是实现逻辑非常简单,所以获取锁和释放锁的速度很快。

优点是表级锁会一次将整个表锁定,所以可以很好的避免死锁的问题。
缺点是锁定颗粒度大是出现锁定资源争用的概率也会最高,致使并发度大打折扣。

    表级锁有两种模式 : 表共享读锁(Table Read Lock)和表独占写锁(Table Write Lock)

(1)表共享读锁:进行读操作时,它不会阻塞其他用户对同一表的读请求,但会阻塞 对同一表的写操作

用法: LOCK TABLE table_name [ AS alias_name ] READ
       指定数据表,LOCK类型为READ即可,AS别名是可选参数,如果指定别名,使用时也要指定别名才可

例子:

      

查询操作失败:

查询操作成功:

    

       不加别名修改失败:

       

       加别名修改失败:

 

权限:

  写操作 读操作
使用读锁线程 否(报错)
不使用读锁线程 否(阻塞)

前提:当前没有线程对该数据表使用写锁,否则申请会阻塞。

(2)表独占写锁:对MyISAM表的写操作,则会阻塞其他用户对同一表的读写操作。

用法: LOCK TABLE table_name [AS alias_name] [ LOW_PRIORITY ] WRITE

别名用法与读锁一样,写锁增加了指定优先级的功能,加入LOW_PRIORITY可以指定写锁为低优先级。

例子:

      加别名查询操作成功:

      不加别名查询操作失败:

      加别名修改成功:

      不加别名修改失败:

前提: 当没有线程对该数据表使用写锁与读锁,否则申请回阻塞。

权限:

  写操作 读操作
使用写锁线程  能   能  
不使用写锁线程   否(阻塞)  能(阻塞)

对于使用写锁的MySQL线程,其可以对锁定表进行读写操作。但是对于其他线程,对指定表读写操作都是非法的,需要等待直到写锁释放。

      锁分配的优先级: LOW_PRIORITY WRITE < READ < WRITE

      注意:相同优先级的锁申请,分配原则为谁先申请,谁先分配

    (3)注意:
 申请锁时使用别名,使用锁定表时必须加上别名
 原因:
 a、 有可能不能操作(查询或更新)没有被锁定的表。

例如当只申请table1的读锁,SQL语句中包含申请的表的话,那么对table2的操作是非法的。例如:


      
    
 b、不能在一个SQL中使用两次表(除非使用别名)

当SQL语句中多次使用一张表时,系统会报错。例如:


      
    
    解决这个问题的方法是使用别名,如果多次使用到一个表,需要声明多个别名。
  
      
    
      (4)释放锁

UNLOCK TABLES;

2、行级锁定(row-level)

引擎 INNODB , 单独的一行记录加锁
     表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折衷的页级,一次锁定相邻的一组记录。

详情:行级锁对于锁定对象的颗粒度来说是很小的。

优点是锁定颗粒度很小,所以发生锁定资源争用的概率也最小,因此在在并发处理能力上面有较大的优势。

缺点是由于锁定资源的颗粒度很小,所以每次获取锁和释放锁需要做的事情也更多,带来的消耗自然也就更大了,比页级锁和表级锁消耗更多的内存。此外,行级锁定也最容易发生死锁。

     行级锁有两种模式 : 共享锁  和  排他锁

(1)共享锁又称为读锁,就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。

用法:select ... lock in share mode

 修改失败:

      共享查成功:


      (2)排他锁又称为写锁,排他锁就是不能与其他所并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改

用法:mysql InnoDB引擎默认的修改数据语句,update,delete,insert都会自动给涉及到的数据加上排他锁,如果加排他锁可以使用select ...for update语句

     测试排他锁例子:

使用begin开启事务,不关闭事务,因为提交事务或回滚事务就会释放锁。

   注:排他锁的启用,除了for update 外还有insert,update, delete

打开另一个查询窗口,对同一数据分别使用排他查和共享锁查询两种方式查询

排他查(失败):

    

   共享查(失败):

    普通查询成功:

     因为排他锁指的是一个事务在一行数据加上排他锁后,其他事务不能再在其上加其他的锁 ,但是普通查询可以,因为普通查询默认不加任何锁。

     但查到的数据是修改数据之前的老数据

(3)注意:
      a、select语句默认不会加任何锁类型
      b、排他锁指的是一个事务在一行数据加上排他锁后,其他事务不能再在其上加其他的锁,但可以直接通过select ...from...查询数据,因为普通查询没有任何锁机制。

3、页级锁定(page-level)

引擎 BDB。
      直接锁定整张表,其它进程无法对该表进行写操作。
      如果你是写锁,则其它进程则读也不允许。

详情:页级锁是MySQL中比较独特的一种锁定级别,页级锁定的特点是锁定颗粒度介于行级锁定与表级锁之间,所以获取锁定所需要的资源开销,以及所能提供的并发处理能力也同样是介于上面二者之间。
      另外,页级锁定和行级锁定一样,会发生死锁。

二、锁定粒度大小比较

表级锁定 > 页级锁定 > 行级锁定

Mysql锁(表级锁,页级锁,行级锁)相关推荐

  1. mysql数据库的行级锁有几种_MySQL中的行级锁、表级锁、页级锁

    在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎).表级锁(MYISAM ...

  2. Mysql存储引擎Innodb的读写锁、行级锁

    读写锁 Mysql存储引擎Innodb在处理并发读或者写的时候,通过两种类型的锁来解决并发问题,这两种锁通常称为共享锁和排他锁,也叫读锁和写锁. 读锁是共享的,即多个客户端可以同时读取同一资源. 写锁 ...

  3. sql 如何设置行级锁_如何使用SQL Server 2016行级安全性过滤和阻止数据访问

    sql 如何设置行级锁 SQL Server 2016 came with many new features and enhancements for existing ones, that con ...

  4. mysql+不锁表添加字段_MySQL5.6在线DDL不锁表(在线添加字段)

    解答你也看一下 MySQL5.6在线DDL不锁表,现在我有一张1亿的表,需要增加一个字段,假如我让你去增加这个字段,你应该注意什么,具体怎么操作? 操作如下: 1.注意磁盘空间(临时表目录 参数 tm ...

  5. oracle查看dml锁表,【lock】我所认识的Oracle中的锁,DML锁、DDL锁、闩和内部锁。...

    这个问题很简单,你一定对锁有一个认识,但你未必对锁有一个明确的定义. 官方文档这样描述:Locks are mechanisms that prevent destructive interactio ...

  6. 查询很慢会导致锁表吗_MySQL的insert into select 引发锁表

    上周五HaC我要上线,有一个脚本需要执行,执行前需要备份一个表. 运维大佬:"这个表的备份为什么要这么久,,??" 1秒过去了--2秒过去了-- 期间运营反馈系统出现大量订单超时情 ...

  7. Oracle查询锁表以及杀会话或系统进程来解除锁表操作

    第一步,查询锁表信息 –查询被锁住的数据库对象 select object_name, machine, s.sid, s.serial#from v$locked_object l, dba_obj ...

  8. 行内元素和块级元素:内联(行级)元素不能设置margin-top

    内联(行级)元素 不能设置宽高,但padding属性可以设置,需要注意的是行级元素不能设置margin-top和margin-bottom属性,但可以设置margin-left和margin-righ ...

  9. 命令行使用mysql创建表空间_达梦命令行创建表空间

    1.2命令方式创建 到数据库安装目录   cd /home/dmdba/bin 执行创建数据库实例的命令: ./dminit  path=/home/dmdba/data db_name=数据库名 i ...

  10. MySQL中的行级锁,表级锁,页级锁

    数据库锁是数据库系统中非常重要的一个概念,本文将深入分析数据库中的锁相关知识,您可点击下方音频收听或直接查看文稿中的文字. 在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并 ...

最新文章

  1. 年薪25万只是白菜价,这几个专业的毕业生正被疯抢
  2. 学python的好处-python有什么优点
  3. CentOS下安装JDK7 转载
  4. matlab画二维颜色深浅,MATLAB scatter 画二维/三维散点图时 用颜色表示数值大小 colorbar
  5. 仅剩3天 | 带学《百面机器学习》葫芦书,算法+leetcode一应俱全
  6. 【struts2】struts2的零配置
  7. python中的__new__概念(工厂
  8. Java 导入导出Excle表格 两种方式
  9. Markdown 添加emoji
  10. 什么是cmm3规范?什么是CMMI5 呢?
  11. 华为经典面试题(敲黑板!!!)
  12. 使用C#开发纽曼USB来电通来电弹屏客户端小结
  13. 【无标题】学习浩辰CAD软件的心得
  14. 6-1 读文章(*)
  15. MissionPlanner MP地面站添加三维地图支持
  16. 程序包不存在 错误解决方法
  17. 为开源新时代赋能 2021开源科技节完美落幕
  18. 相机寻找最适合分辨率android,ARCore:获取相机的分辨率(ARCore : Get Camera's resolution)...
  19. 细思极恐啊,哈哈哈哈哈哈
  20. Kimera: an Open-Source Library for Real-TimeMetric-Semantic Localization and Mapping论文阅读

热门文章

  1. Python:对列表分组、拆分
  2. python基础知识Day07
  3. EF框架你了解多少?
  4. [openjudge] Ride to Office
  5. 阅文新合同出炉,依旧被吐槽:换汤不换药?
  6. java----记录jedispool的一个坑 jedispool导致线程阻塞
  7. 论文笔记——Using Progressive Context Encoders for Anomaly Detection in Digital Pathology Images
  8. Ubuntu19.10 使用sudo apt-get install命令时报E: Unable to correct problems, you have held broken packages.
  9. 大学生计算机协会举办的比赛和活动,计算机协会“英雄联盟”赛事活动总结
  10. mybatis基础动态SQLlog4j简单使用