Mariadb之显式使用表锁和行级锁 – Linux「建议收藏」

Mariadb之显式使用表锁和行级锁 – Linux「建议收藏」首先我们来看看mariadb的锁定概念,所谓锁就是当一个进程或事务在操作某一资源时,为了防止其他用户或者进程或事务对其进行资源操作,导致资源抢占而发生冲突,通常在A进程操作该资源时,会对该资源进行加锁

Mariadb之显式使用表锁和行级锁 - Linux

  首先我们来看看mariadb的锁定概念,所谓锁就是当一个进程或事务在操作某一资源时,为了防止其他用户或者进程或事务对其进行资源操作,导致资源抢占而发生冲突,通常在A进程操作该资源时,会对该资源进行加锁,实现多进程或多用户操作同一资源时,不会发生冲突;通常情况锁的类型分读锁和写锁,所谓读锁就是共享锁,它可以实现多个读操作共享;而写锁就是排它锁,独占锁,一旦加了写锁,其他用户的读写操作将被阻塞,直到该写锁被释放或者因超时而被释放,在其他用户进行的读写操作,此时就会被执行;对于锁定范围来讲,它又可以分为,表锁和行锁,从字面意思就可以理解到,表锁就是针对整张表所施加的锁,而这种锁定力度相当粗糙,并发相对就比较低,但是维持锁状态锁消耗的成本资源就较小;对于行锁来说,它针对的范围就是行级别所施加的锁,这种锁的粒度就相对要精细,同时并发相对较高,但是维护锁状态消耗的成本资源就相对要大;对于mysql来讲又锁分为存储引擎级别的锁和mysql server级别的锁,存储引擎级别的锁指的是对于何时施加锁或者释放锁由存储引擎自行决定;mysql server级别锁指的是用户使用命令可自行决定施加锁或释放锁;简单讲就是允许用户显式请求加锁或释放锁;显式锁就是用户手动用命令施加的锁,隐式锁指的是由存储引擎根据需要自行施加的锁;对于innodb存储引擎来讲,它支持事务,行级锁;而早期的MyISAM存储引擎它不支持事务,对锁的粒度是表级锁,不支持行级锁;

  显示锁的使用

  1)LOCK TABLES

    指令使用语法:

    LOCK TABLES  tbl_name  read|write, tbl_name read|write, …

  示例:

Mariadb之显式使用表锁和行级锁 - Linux「建议收藏」

  提示:以上语句表示对test_tb这张表施加读锁操作,这意味着其他用户或进程都不能对该表进行写的操作,只能读,因为读锁上共享锁;

  测试:对test_tb表进行写操作,看看是否能够写进去?

Mariadb之显式使用表锁和行级锁 - Linux「建议收藏」

  提示:从上面的提示,它告诉我们test_tb这张表施加了读锁,不允许更新;这说明施加读锁,对于写的操作就不能进行;

  测试:对test_tb表进行读操作,看看是否能够进行呢?

Mariadb之显式使用表锁和行级锁 - Linux「建议收藏」

  提示:可以看到加了读锁的表,对于读操作上可以继续进行的;

  测试:对test_tb表施加写锁

Mariadb之显式使用表锁和行级锁 - Linux「建议收藏」

  提示:释放锁用unlock tables即可释放刚才的读锁;

  测试:对test_tb进行写操作,看看是否能够进行?

Mariadb之显式使用表锁和行级锁 - Linux「建议收藏」

  提示:在当前终端(加写锁所在终端)上是可以进行读写操作的;

  测试:在其他终端看看是否能够对test_tb表进行读写操作呢?

Mariadb之显式使用表锁和行级锁 - Linux「建议收藏」

  提示:从上面的截图可以看到当我们重新启动一个终端对test_tb进行写操作,它一直处于阻塞状态;

Mariadb之显式使用表锁和行级锁 - Linux「建议收藏」

  提示:对于对操作也是同样的效果;一直阻塞着;

  总结:对于施加读锁的表,是可以进行读操作的,但是不能进行写操作,包括当前终端也不能写操作;对于施加写锁的表,在当前施加锁的终端上是可以对其进行读写操作的,但是在别的终端读写操作都将阻塞;

  除了以上指令来对表进行加锁外,还可以使用 flush tables指令来加读锁,具体语法请看下面;

  FLUSH TABLES tbl_name,… [WITH READ LOCK];

  测试:加读锁

Mariadb之显式使用表锁和行级锁 - Linux「建议收藏」

  提示:以上flush tables 只能加读锁,不能加写锁;

  行级锁:SELECT cluase [FOR UPDATE | LOCK IN SHARE MODE]

  行级排它锁

Mariadb之显式使用表锁和行级锁 - Linux「建议收藏」

  提示:以上红框中的内容就是给第一行加了一个排它锁,这意味着该事务没有提交,其他事务就不能再获取该行的其他锁,包括共享锁和排它锁,但是获取排它锁的事务是可以对数据就行读取和修改。

Mariadb之显式使用表锁和行级锁 - Linux「建议收藏」

  提示:可以看到我们重新启动一个事务,然后对第一行进行更新操作,语句就阻塞在哪里了;说明行级排它锁对其他事务来讲是不允许对加锁的行进行写操作;默认情况updeate更新会默认加上排它锁,因为对于第一行来讲,已经有一个排它锁了,所以其他事务就不能对其在加其他锁;而对于select语句来讲,它执行时默认会加任何锁的,所以我们执行select语句是可以正常的查看第一行数据;如果我们在select后面手动加锁,它也会阻塞的;如下

Mariadb之显式使用表锁和行级锁 - Linux「建议收藏」

  提示:从上面的截图信息可以看到,我们手动加上排它锁,查询语句也不会顺利执行;从上面信息还可以了解到,我们对第二行也没法进行操作,这又是为什么呢?

Mariadb之显式使用表锁和行级锁 - Linux「建议收藏」

  提示:我们查看test_tb这张表上的索引信息,发现没有索引,然后我们在上面创建了一个索引;创建索引时,需要把前面的事务提交了,才可创建成功,否则一直锁在哪里的;接下来我们在创建一个事务,把第一行加上排它锁,然后在对第二行操作看看是否还会一直阻塞呢?

Mariadb之显式使用表锁和行级锁 - Linux「建议收藏」

Mariadb之显式使用表锁和行级锁 - Linux「建议收藏」

  提示:可以看到当我们创建就了索引后,再对第一行加锁,然后更新第二行就可以正常更新了 ,对第一行还是处于阻塞状态;这说明innodb存储引擎的行级锁的实现其实是依靠其对应的索引,所以如果操作的行并没有用到索引,那么用的还是表级锁。施加行级排它锁后,其他事务将不能对其在施加任何锁;那么对于获取到排它锁的是否能够正常操作呢?

Mariadb之显式使用表锁和行级锁 - Linux「建议收藏」

  提示:对于获取到排它锁的事务,是可以正常更新修改的;也可以给对应行施加其他锁;

  行级共享锁

Mariadb之显式使用表锁和行级锁 - Linux「建议收藏」

  提示:以上红框中的内容表示给第一行施加共享锁,这意味着在其他事务锁可以共享这把锁看到数据,但是不能更新修改数据;

  测试:在当前事务中更新数据,看看是否可更新?

Mariadb之显式使用表锁和行级锁 - Linux「建议收藏」

  提示:在当前事务中是可以正常修改数据的;也能正常查看数据;

  在其他事务中修改数据,看看是否可修改?

Mariadb之显式使用表锁和行级锁 - Linux「建议收藏」

  提示:可以看到在其他事务中,就不能对有共享锁的行进行修改操作,但是可以正常读;

  总结:innodb存储引擎的行级锁依赖索引,如果没有索引,就相当于表级锁;对于排它锁来讲,获取到排它锁的事务是可以正常修改更新以及加共享锁,对于没有获取到排它锁的事务,是不能够对有锁的行进行修改更新以及加锁的操作;对于共享锁来讲,对于当前事务(加锁操作的事务)是可以正常修改更新有锁的行,对于其他事务,是不可修改和更新有锁的行;

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/7696.html

(0)
上一篇 2023-03-15 20:30
下一篇 2023-03-16

相关推荐

  • Python绘图教程

    Python绘图教程Python作为一种高级编程语言,被广泛应用于各个领域,其中,Python绘图也成为了其重要应用之一。Python绘图能够直观地展示数据,使得用户可以更加直观地了解数据分布和数据趋势。同时,Python绘图还可以被用来制作信息图、展示统计数据等。Python绘图能够操作的图像类型包括可视化、绘制区域、控制坐标轴和标签等众多操作。

    2024-06-10
    54
  • Python中raise的用法

    Python中raise的用法在Python中,raise是一种用于产生异常的关键字。当程序遇到无法处理的错误或者特殊情况时,可以使用raise来抛出异常。通过raise,我们可以自定义错误信息和异常类型,从而更好地控制程序运行过程中的错误和异常情况,让程序更加健壮和稳定。

    2024-05-29
    69
  • hbase跨集群数据迁移_hbase region

    hbase跨集群数据迁移_hbase region前言: 《读者来信》是HBase老店开设的一个问答专栏,旨在能为更多的小伙伴解决工作中常遇到的HBase相关的问题。老店会尽力帮大家解决这些问题或帮你发出求救贴,老店希望这会是一个互帮互助的小平台。有

    2023-02-13
    154
  • excel 截取 字符串_excel 字符串比较

    excel 截取 字符串_excel 字符串比较怎么样可以从一串字符中的某个指定位置的前或后截取指定个数的字符.如:12345.6789,我要截取小数点前(或后)的3个字符.怎么样操作,另外,怎么样从右边截取字符,就是和left()函数相反的那个功能.=find(“.”,a2)返回在数字中字符(小数点)的位置。具体公式如下:字符(小数点)前三位=MID(A2,FIND(“.”,A2)-3,3)字符(小数点)后三个=MID(A2,FIND(“.”,A2)+1,3)字符(小数点)前面的所有数字=LEFT(A2,FIND(“

    2023-03-02
    162
  • MySql笔记(二)[通俗易懂]

    MySql笔记(二)[通俗易懂]一幅画,一次瞬间的回眸,就在那次画展上,那个眼神,温柔的流转,还是那干净的皮鞋,一尘不染,俊朗的眉宇性感的唇,悄悄走近,牵手一段浪漫 [toc] MySQL笔记(二) 13、条件查询 1.普通条件查询

    2023-01-23
    149
  • 倒序遍历Python

    倒序遍历Python在Python语言中,倒序遍历是一种非常常见的操作。倒序遍历Python有多种实现方式,包括倒序遍历数组、前序遍历二叉树、倒序遍历列表、range倒序遍历、vector倒序遍历、v-for倒序遍历、list倒序遍历、map倒序遍历、iterator倒序遍历、for循环倒序遍历等。在本文中,我们将从多个方面对倒序遍历Python做详细介绍,并给出代码示例。

    2024-07-19
    42
  • 实战kudu集成impala[通俗易懂]

    实战kudu集成impala[通俗易懂]推荐阅读: 论主数据的重要性(正确理解元数据、数据元) CDC+ETL实现数据集成方案 Java实现impala操作kudu 实战kudu集成impala impala基本介绍 impala是clou

    2023-01-23
    157
  • 使用Python实现微信自动发送信息功能

    使用Python实现微信自动发送信息功能微信是目前最受欢迎的社交软件之一,它方便人们进行日常沟通和交流。在很多场合中,我们需要使用微信向朋友或者客户发送信息,然而手动发送信息费时费力,这时候使用自动化发送信息的方式可以提高效率。而Python正是一种十分适用于自动化任务的编程语言,本文将介绍如何使用Python实现自动发送微信信息的功能。

    2024-04-19
    77

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注