我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQ数据库锁定机制是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQ数据库锁定机制是什么

本篇内容主要讲解“MySQ数据库锁定机制是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQ数据库锁定机制是什么”吧!

1. MySQL 锁定机制简介

各存储引擎使用三种类型锁定机制

  • 行级锁定(row-level)

  • 表级锁定(table-level)

  • 页级锁定(page-leve) :页级锁定介于行级锁定与表级锁定之间。

2. MySQL 数据库

Mysql数据库中表级锁定主要是 MyISAM、Memory、CSV 等一些非事务性存储引擎,使用行级锁定主要是 InnoDB 存储引擎和 NDB Cluster 存储引擎,页级锁定主要是 BerkeleyDB 存储引擎。

3. MyISAM 表级锁定主要分为两种类型
  • 读锁定,一个新客户端在申请获取读锁定资源的时候,需要满足两个条件:

    • 请求锁定的资源当前没有被写锁定

    • 写锁定等待队列 (Pending write-lock queue)中没有更高优先级的写锁定在等待

    • (只影响写操作)

  • 写锁定

    • (影响读操作,同时也影响写操作)

4.  队列

Mysql种主要分 4 中队列来维护这两种锁定:两个存放当前正在锁定的读和写锁定信息,另外两个存放等待中的读写锁定西信息,如下:

  • Current read-lock queue (lock->read)

  • Pending read-lock queue (lock->read_wait)

  • Current write-lock queue (lock->write)

  • Pending write-lock queue (lock->write_wait)

5. InnoDB 的行级锁定分为四种类型
  • 共享锁 (有叫做:读锁)

    • 允许一个事务去读一行,阻止其他事务获得相同数据的排它锁。

  • 排他锁 (有叫做:写锁)

    • 允许获得排它锁的事务更新数据,阻止其他事务

  • 意向共享锁

  • 意向排他锁

6.  InnoDB 间隙锁

InnoDB 的锁定是通过在指向数据记录的第一个索引键之前和最后一个索引键之后的空域空间标记锁定信息实现的。这种锁定方式被称为 “NEXT-KEY locking”(间隙锁)
间隙锁弱点:锁定一个范围之后,即使某些不存在的键值也会被无辜锁定,造成锁定的时候无法插入键值锁定内的任何数据。
通过索引实现锁定的方式存在其他几个较大的性能隐患:

  1. 当 Query 无法利用索引的时候,InnoDB 会放弃使用 行级锁定 而改用 表级锁定 ,造成并发性能降低;

  • 当 Query 使用的索引并不包含所有过滤条件时,数据检索使用到的索引键中的数据可能有部分不属于 Query 的结果集行列,但是也会被锁定,因为间隙锁锁定的是一个范围,而不是具体的索引键。

  • 当 Query 在使用索引定位数据的时候,如果使用的索引键一样但访问的数据行不同 (索引只是过滤条件的一部分), 他们一样会被锁定。

7. MyISAM 表锁优化建议
  • 缩短锁定时间

    • 尽量减少大的复杂 Query,将复杂 Query 拆分成几个小的 Query 执行。

    • 尽可能地建立足够高效的索引,让数据检索更迅速。

    • 尽量让 MyISAM 存储引擎的表只存放必要的信息,控制字段类型。

    • 利用合适的机会优化 MyISAM 表数据文件。

  • 分离能并行的操作

    • concurrent_insert = 2,无论 MyISAM 存储引擎的表数据文件的中间部分是否存在因为删除数据而留下的空闲空间,都允许在数据文件尾部进行 Concurrent Insert。

    • concurrent_insert = 1,MyISAM 存储引擎表数据文件中间不存在空闲空间的时候,可以从文件尾部进行 Concurrent Insert。

    • concurrent_insert = 0, 无论 MyISAM 存储引擎的表数据文件的中间部分是否存在因为删除数据而留下的空闲空间,都不允许 Concurrent Insert。(读锁时,不允许插入)

    • MyISAM 并非只能完全的串行化,MyISAM 存储引擎还有一个特性 Concurrent Insert(并发插入)的特性。

    • MyISAM 存储引擎有一个控制是否打开 Concurrent insert 功能的参数选项:concurrent_insert 可以设置为 0/1/2:具体如下:

  • 合理利用读写优先级

    • 表级锁定 默认情况下写优先级大于读,如果读操作多的时候,可以设置读优先级高,可设置参数 low_priority_updates = 1。

8.  InnoDB 行锁优化建议
  • 尽可能让所有的数据检索都通过索引来完成,从而避免 InnoDB 因为无法通过索引键加锁而升级为表级锁定

  • 合理设计索引,让 InnoDB 在索引键上加锁的时候尽可能准确,尽可能地缩小锁定范围,避免造成不必要的锁定而影响其他 Query 的执行。

  • 尽可能减少基于范围的数据检索过滤条件,避免因间隙锁带来的负面影响而锁定了不该锁定的记录。

  • 尽量控制事务大小,减少锁定的资源量和锁定的时间长度。

  • 在业务环境允许的情况下,尽量使用较低级别的事务隔离,减少 MySQL 因为实现事务隔离级别所带来的附加成本。

 9.  系统锁定争用情况查询

MySQL 内部有两组专用的状态变量记录系统内部资源争用情况。

  •  表级锁定的争用状态变量

mysql> show status like ‘table%’;


    • Table_locks_immediate:产生表级锁定的次数;

    • Table_locks_waited:出现表级锁定争用而发生等待的次数

Table_locks_immediate 值大于 Table_locks_waited 5000 是比较合适的,在大就需要分析问题所在。
两个状态值都是从系统启动后开始记录,每出现一次加 1,如果这里 Table_locks_waited 状态值比较高,说明表级锁定争用严重,需进一步分析。

  • InnoDB 行级锁定状态变量记录

sql> show status like ‘innodb_row_lock%’;


    • Innodb_row_lock_current_waites:当前正在等待锁定的数量;

    • Innodb_row_lock_time:从系统启动到现在锁定总时间长度;

    • Innodb_row_lock_time_avg:每次等待所花平均时间;

    • Innodb_row_lock_time_max:从系统启动到现在等待最长的一次所花的时间;

    • Innodb_row_lock_waits:从系统启动到现在总等待次数。

5 个状态,比较重要的是 Innodb_row_lock_time_avg(等待平均时长),Innodb_row_lock_waits(等待总次数)及 Innodb_row_lock_time(等待总时长)

10. 除此之外

InnoDB除了提供以上 5 个系统状态变量外,还提供了更为丰富的即时状态信息,实现方法如下:

  • 创建 InnoDB Monitor 表来打开 InnoDB 的 monitor 功能

    • mysql > create table innodb_monitor(a int) engine=innodb;

  • 然后执行 ”show innodb status” 查看详细信息

为什么创建 innodb_monitor 表?

创建该表就是告诉 InnoDB 我们要开始监控他的详细信息,然后 InnoDB 就会将比较详细的事务级锁定信息记录到 MySQL 的 error log 中,以便后面做进一步分析。

到此,相信大家对“MySQ数据库锁定机制是什么”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQ数据库锁定机制是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

数据库的锁机制是什么

数据库的锁机制是一种用于保护数据库的一致性和并发操作的机制。它确保数据库中的数据在被多个并发事务访问和修改时保持一致性,避免数据的混乱和冲突。常见的数据库锁机制包括:1. 共享锁(Shared Lock):多个事务可以同时获取共享锁,用于读
2023-09-20

【数据库】MySQL中的锁机制

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

MySQL加锁机制是什么

这篇文章主要介绍MySQL加锁机制是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!前言在数据库中设计锁的目的是为了处理并发问题,在并发对资源进行访问时,数据库要合理控制对资源的访问规则。而锁就是用来实现这些访问规
2023-06-29

MySQL数据库锁机制原理解析

在并发访问情况下,很有可能出现不可重复读等等读现象。为了更好的应对高并发,封锁、时间戳、乐观并发控制(乐观锁)、悲观并发控制(悲观锁)都是并发控制采用的主要技术方式。 锁分类①、按操作划分:DML锁,DDL锁②、按锁的粒度划分:表级锁、行级
2022-05-21

MySQL中的锁机制是什么

这篇“MySQL中的锁机制是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“MySQL中的锁机制是什么”文章吧。一.概述锁
2023-07-05

Java中的锁机制是什么

今天小编给大家分享一下Java中的锁机制是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Java中的锁机制是保证多线程并
2023-07-05

mysql锁机制是什么意思

mysql 的锁机制通过防止并发事务同时写入或更新相同数据,来确保数据库的 acid 属性。它提供了表锁(以整个表为粒度)和行锁(以行或一组行为粒度)。锁的级别包括读锁、写锁、意向共享锁和意向排他锁。事务请求锁时,dbms 会进行冲突检测并
mysql锁机制是什么意思
2024-06-02

数据库连接池的工作机制是什么

数据库连接池的工作机制是为了提高数据库操作的性能和效率。它通过预先创建和管理一定数量的数据库连接,以避免频繁地创建、销毁连接,从而减少了系统开销和资源消耗。下面是数据库连接池的工作机制:1. 初始化连接池:在系统启动时,连接池会创建一定数量
2023-09-15

编程热搜

目录