欢迎来到阿里云授权服务中心典名科技有限公司!咨询电话:023-66887777 18623333330

微信
手机版
网站地图

MySQL数据库中有哪些锁

2021-08-31 11:24:19 投稿人 : admin 围观 : 235 次 0 评论

“MySQL数据库中有哪些锁”,在日常操作中,相信很多人在MySQL数据库中有哪些锁问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL数据库中有哪些锁”的疑惑有所帮助!接下来!

在 MySQL 数据库中,锁有很多种类型,不过大致可以分为三类:全局锁、表级锁、行级锁。这篇文章我们就简单的聊一聊这三种锁。

全局锁

全局锁是粒度比较大的锁,基本上也使用不上,就像我们家的大门一样,控制着整个数据库实例。全局锁就是对整个数据库实例加锁,让整个数据库处于只读状态。

MySQL 提供了一个加全局读锁的方法,命令是 Flush tables with read lock  (FTWRL),加锁之后整个数据库实例处于只读状态,有关数据操作的命令都会被挂起阻塞,例如数据更新语句、数据定义语句、更新类事务语句等等。

所以全局锁一般只用于全库备份的时候,一般只用在不支持一致性读的存储引擎做全库备份时,比如 MyISAM  这种不支持一致性读的存储引擎做全库备份时需要使用全局锁,像 InnoDB 引擎做全库备份时不需要使用全局锁。

image.png

表级锁

表级锁是 MySQL 很基本的锁策略,并且是开销最小的策略,它锁住的不是整个数据库实例,而是一张表。

表级锁跟全局锁一样,MySQL 数据库提供了加锁的命令:lock tables … read/write。例如 lock tables t1 read,  t2 write; 命令,则其他线程写 t1、读写 t2 的语句都会被阻塞。同时,线程 A 在执行 unlock tables 之前,也只能执行读 t1、读写  t2 的操作。连写 t1 都不允许,自然也不能访问其他表。

我们可以使用 unlock tables 主动释放锁,如果没有使用的话,在客户端断开的时候自动释放。

表级锁存在一个问题,如果一个查询正在遍历一个表中的数据,而执行期间另一个线程对这个表结构做变更,删了一列,那么查询线程拿到的结果跟表结构对不上,肯定是不行的。

为了解决这个问题,MySQL 5.5版本之后引入了元数据锁(meta data lock,MDL),MDL  是数据库自动加锁,当对一个表做增删改查操作的时候,加 MDL 读锁;当要对表做结构变更操作的时候,加 MDL 写锁。

MDL 锁有以下两个特点:

  • 读锁之间不互斥,因此你可以有多个线程同时对一张表增删改查。

  • 读写锁之间、写锁之间是互斥的,用来保证变更表结构操作的安全性。因此,如果有两个线程要同时给一个表加字段,其中一个要等另一个执行完才能开始执行。

行级锁

行级锁顾名思义就是针对数据库表中的行记录加锁,行级锁可以很大程度的支持并发处理,但是同时也带来了很大的锁开销。

行级锁比较容易理解,比如事务 A 更新了一行,而这时候事务 B 也要更新同一行,则必须等事务 A 的操作完成后才能进行更新。

行级锁是由存储引擎各自实现的,也并不是所有的存储引擎都支持行级锁,比如 MyISAM 引擎就不支持行级锁,这意味着 MyISAM  存储引擎要控制并发只能使用表级锁。

InnoDB 引擎实现了行级锁,InnoDB 存储引擎中实现了两种标准的行级锁:

  • 共享锁(S Lock):允许事务读一行

  • 排它锁(X Lock):允许事务删除和更新一行

共享锁是兼容锁,就是当一个事务已经获得了行 r 的共享锁,其他事务可以立即获得行 r 的共享锁,因为读并未改变行 r 的数据。

排他锁是非兼容锁,如果有事务想获取行 r 的排他锁,若行 r 上有共享锁或者排它锁,则它必须等其他事务释放行 r 的锁。

在 InnoDB  存储引擎中,默认情况下使用的是一致性的非锁定行读,也就是通过行多版本控制器来读取行数据,我们可以显示的为行加上共享锁和排它锁,语句如下:

  • SELECT ..... FOR UPDATE:对读取的行记录加一个排它锁,其他事务想要在这些行上加任何锁都会被阻塞

  • SELECT ....... LOCK IN SHARE  MODE:对读取的行记录加一个共享锁,其他事务可以向被锁定的记录加共享锁,但是想要加排它锁。则会被阻塞。

版权声明:本站部分文章内容、图片来源于网友推荐、互联网收集整理而来,仅供大家学习参考,不代表本站立场,如有侵权,请联系站长,我们会第一时间处理!本站原创内容未经允许不得转载,或转载时需注明出处:典名科技资讯门户

相关文章

  • mysql5.7如何修改root密码
    mysql5.7如何修改root密码

    这篇文章主要介绍了mysql5.7如何修改root密码的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇mysql5.7如何修改root密码文章都会有所收获,下面我们一起来看看吧。方法:1、用“set passwo...

    2022-05-23 13:47:02
  • mysql如何修改column
    mysql如何修改column

    这篇文章主要介绍“mysql如何修改column”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“mysql如何修改column”文章能帮助大家解决问题。方法:1、用“alter table 表名 mo...

    2022-05-23 13:47:01
  • mysql的慢查询日志记录哪些内容
    mysql的慢查询日志记录哪些内容

    本篇内容主要讲解“mysql的慢查询日志记录哪些内容”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mysql的慢查询日志记录哪些内容”吧!在mysql中,慢查询日志记录的是响应时间超过阈值的语句...

    2022-05-23 13:47:01
  • 常见SQL注入类型及原理是什么
    常见SQL注入类型及原理是什么

    这篇“常见SQL注入类型及原理是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“常见SQL注入类型及原理是什么”文章吧。M...

    2022-05-23 13:47:01
  • mysql workbench中如何注释
    mysql workbench中如何注释

    本篇内容介绍了“mysql workbench中如何注释”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!mysql workbench中的注释...

    2022-05-23 13:46:58
  • mysql如何修改definer
    mysql如何修改definer

    这篇文章主要介绍“mysql如何修改definer”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“mysql如何修改definer”文章能帮助大家解决问题。修改方法:1、利用“update mysql...

    2022-05-23 13:46:56
  • mysql如何查询当前登录的用户
    mysql如何查询当前登录的用户

    本文小编为大家详细介绍“mysql如何查询当前登录的用户”,内容详细,步骤清晰,细节处理妥当,希望这篇“mysql如何查询当前登录的用户”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。方法:1、用USER()函数,...

    2022-05-18 10:01:01
  • mysql如何查询外键约束
    mysql如何查询外键约束

    这篇文章主要介绍了mysql如何查询外键约束的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇mysql如何查询外键约束文章都会有所收获,下面我们一起来看看吧。在mysql中,可以利用show语句查询外键约束,sh...

    2022-05-18 10:01:01
  • mysql查询如何设置降序
    mysql查询如何设置降序

    本篇内容介绍了“mysql查询如何设置降序”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在mysql中,可以利用desc关键字对查询结果进行...

    2022-05-18 10:01:00
  • mysql如何修改主键的值
    mysql如何修改主键的值

             这篇文章主要介绍了mysql如何修改主键的值的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇mysql如何修改主键的值文章都会有所收获,下面我们...

    2022-05-18 10:01:00
发表评论