数据库锁表如何处理

2023-10-27

前段时间阿粉在公司开发的时候,不慎导致了数据库产生了锁表的操作,因为阿粉之前从来没有遇到过,之前只是了解过一点,所以导致了锁表,于是阿粉为了解决问题,研究了一下这一部分的内容,于是决定把这一块的知识分享给大家。

数据库锁定机制

话说如果你只是单纯的说 “锁表”,总是让人感觉有点 Low ,而我们就直接换个比较高大上一点的名词,锁定机制!

为了保证数据的完整,也就是他的一致性和有效性,所以才会让数据库出现了锁定机制,相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。

  • MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking)

  • BDB存储引擎采用的是页面锁(page-level locking),也支持表级锁

  • InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁

我们先来瞅瞅看一下这些锁都是个什么鬼东西!

行级锁(row-level locking)

  • 锁的对象颗粒度很小

  • 各大数据库中锁粒度最小的

  • 锁定资源占用概率最小

虽然说行级锁的优点是很明显,但是相对的弊端也因为他的优点出现了,

  • 因为锁定的粒度比较小,所以每次获取锁和释放锁需要做更多的内容,带来的消耗必然也就更大了,

  • 行级锁也是最容易发生死锁的。

  • 并发度也最高

表级锁(table-level locking)

  • 和行锁相反,粒度是最大的

  • 逻辑简单,对系统的负面影响比较小

  • 获取锁和释放锁速度快

  • 并发度最低。

弊端也有,因为粒度比较大,锁定资源占用概率也会很大,

页级锁(page-level locking)

  • 比较特殊,介于行锁和表锁之间,所以他的能力都是介于两者之间的,就是

粒度比较 表级锁 > 页锁 > 行锁

而他的并发度也就是一般般了。但是他会出现死锁,这三个当中,看来也就只有表锁不会出现死锁了。

我们在这里已经算是对锁机制大致有了个了解,我们再细致的看一下

表锁

表锁实际上分为2种类型,

  1. 读锁定

  2. 写锁定

而这两种锁定,又是通过其内部的队列来进行维护的,

  • 当前读锁队列 (Current read-lock queue)

  • 挂起的读锁队列(Pending read-lock queue)

  • 挂起写锁队列(Pending write-lock queue)

  • 当前写锁队列(Current write-lock queue)

什么意思呢?

当前读锁的队列,实际上就是包含了当前所有的持有读锁的线程,这里面的内容就是按照获取锁的时间进行有序的排放,

而挂起的读锁队列中存放的则是等待获取所得线程。

那写锁大家肯定也知道是什么意思了,就像是个4*100接力一样。拿着“棒子”的,就是当前读/写锁队列,等着接 “棒子” 的就是 挂起的读/写锁队列。

行锁

MySQL的 InnoDB 存储引擎支持行级锁,InnoDB 的行锁是通过给索引项加锁实现的。

这句话说明了什么?

说明了一件事:只有通过索引条件检索数据时,InnoDB 才使用行锁,否则使用表锁。

是不是感觉很诧异,但是事实上就是这样的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5Rhbo8Lr-1635213674895)(http://www.justdojava.com/assets/images/2019/java/image_yi/2021/10-18/1.jpg)]

InnoDB 级别的行锁也是分成了两种

  • 共享锁

  • 独占锁

共享锁和独占锁(Shared and Exclusive Locks),InnoDB 通过共享锁和独占所两种方式实现了标准的行锁。共享锁(S 锁):允许事务获得锁后去读数据,独占锁(X 锁):允许事务获得锁后去更新或删除数据。一个事务获取的共享锁 S 后,允许其他事务获取 S 锁,此时两个事务都持有共享锁 S,但是不允许其他事务获取 X 锁。如果一个事务获取的独占锁(X),则不允许其他事务获取 S 或者 X 锁,必须等到该事务释放锁后才可以获取到

很多读者肯定也都了解的很深入,肯定还有其他的,对,还有一种就是意向共享锁和意向独占锁。

这种意向共享锁和意向独占锁的意思就是如果我需要一个共享锁,但是这个共享锁这时候正锁定这资源,那我自己就可以加一个共享锁,只能等这个共享锁释放之后,我才能锁定,这个锁就可以称之为意向共享锁,同理,独占锁也是一样的。

而他们之间的逻辑关系是这个样子的。

共享锁 独占锁 意向共享锁 意向独占锁
共享锁 兼容 冲突 兼容 冲突
独占锁 冲突 冲突 冲突 冲突
意向共享锁 兼容 冲突 兼容 兼容
意向独占锁 冲突 冲突 兼容 兼容

数据库锁表的原因

其实最简单的就是会出现在 insert、update、delete 这些操作的并发操作上,当我们使用多个数据库连接的时候,同时对一个表中的数据进行更新的操作的时候,那么速度就会对应的变慢,如果持续一段时间之后,那么就会出现锁表的现象了。

那么都有哪些操作会导致出现锁表呢?

1.插入查询的语句

insert into table values select xxxx from table2

这种情况就会锁住table2.

2.更新并发操作

update table1 table2 set table1.name = ‘xxx’ where table1.id = table2.id

这样也会导致锁表。

怎么样降低锁表的情况?

MyISAM表锁的优化:

  1. 缩短锁定的时间

这么说吧,实际上最简单的就是加索引,让你的索引利用最大化,

  1. 合理利用读写优先级

写优先,读其次。

Innodb行锁的优化

  1. 加索引,让查询走索引

  2. 学会控制事务

  3. 隔离级别不要随便设置,根据不同情况不同选择就可以了

文章参考

《MySQL性能调优》

关注我,送各种电子书呦
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据库锁表如何处理 的相关文章

  • 在 StackOverflow 克隆中,评论表与问题和答案应该有什么关系?

    在我正在构建的类似于 StackOverflow 的应用程序中 我试图确定我的关系Questions Answers and Comments表应该有 我本可以有Questions and Answers两者都由一个表表示Posts 那将允
  • 我将 MySQL 列设置为“NOT NULL”,但我仍然可以插入空值

    在 MySQL 中 我有一个 Column1 为 NOT NULL 的表 create table myTable Column1 int not null Column2 int not null 我仍然可以像这样插入一个空值 INSER
  • 将 SQL Server 数据库合并为 1

    我需要将 20 个具有相同结构的数据库合并为 1 个数据库 我看到了这个帖子 以最小的延迟将来自许多不同数据库的数据整合到一个数据库中 https stackoverflow com questions 2537986 consolidat
  • FIREBASE 数据库 - 存储子节点的唯一密钥(Swift/IOS)

    我正在尝试存储生成的独特的钥匙当 childByAutoId 被调用时 理论上 它将有助于映射稍后需要在我的应用程序中发生的指定子项的更新或更改 我对 Firebase 的分层数据库相当陌生 如果下面描述的方法不正确 请随时提供替代方案 我
  • PHP - 解析具有固定列宽的文本文件

    我是 PHP 和 Laravel 的新手 我需要打开文件并解析内容以将它们传递到数据库 文本文件具有固定的列宽 它没有分隔符或标题 我认为使用子字符串并将每个子字符串分配给变量将是正确的方法 但我仍在学习该语言的过程中 我不知道如何实现这一
  • 如何打开sqlite数据库并将其转换为pandas dataframe

    我已经下载了一些数据作为 sqlite 数据库 data db 我想在 python 中打开这个数据库 然后将其转换为 pandas 数据框 这是到目前为止我所做的 import sqlite3 import pandas dat sqli
  • 什么时候数据库被称为嵌入式数据库?

    术语 嵌入式数据库 与 数据库 具有不同的含义吗 我见过的嵌入式数据库有两种定义 嵌入式数据库就像专门为 嵌入式 空间 移动设备等 设计的数据库系统一样 这意味着它们在紧张的环境中 内存 CPU 方面 可以合理地执行 嵌入式数据库就像不需要
  • 在实时计算机上更新(或替换)整个数据库表的最佳方法是什么?

    我每周都会收到一个数据源 我将对其进行解析并放入数据库中 数据每周不会有太大变化 但我应该定期更新数据库 除了每周更新外 数据是静态的 目前重建整个数据库不是问题 但最终该数据库将上线 人们可以在我重建数据库时查询该数据库 数据量并不小 几
  • 在哪里可以下载可用作数据仓库的示例数据库? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 在哪里可以下载可用于创建数据仓库的示例数据库 它不应该是来自 Microsoft Northwind
  • cdb - 大文件(数百 GB)的常量键值存储

    我需要一个类似于 cdb 常量数据库 的工具 它允许我在索引文件中存储大量数据 数百 GB 范围内 CDB 是理想的候选者 但它有 2 GB 的文件大小限制 因此不适合 我正在寻找的功能是支持二进制键和值的持久键值存储 创建后数据库是只读的
  • 环回:原子读取和更新

    有没有办法在环回中实现类似的东西 LOCK READ INCREMENT UNLOCK 我想将计数器保留为数据库值 每个键都是一个计数器 或一个设置 并且它们不应该同时访问我的多个请求 此外 这也应该适用于本地请求 无 RemoteHook
  • 如何获取与值匹配或存在于另一个表中的记录?

    我试图弄清楚在这种情况下如何获取所有任务 其中两个字段等于某个值或者它们存在于另一个表中 这是查询 SELECT TASKS task id TASKS task title TASKS task description TASKS tas
  • 数百个别名/同义词与数据库表的完全限定名称

    考虑到多个模式中的数百个数据库表 在创建存储过程和视图时 您是否建议使用别名 同义词或完全限定名称 给定一些 schema table 像这样 Orders OrderHeader Production LineThroughput Sal
  • 通过单击按钮将 Access 中的数据获取到 C# 中的文本框中

    我在 MS Access 中有一个表 其中包含 FoodID FoodName Price 在 C 中 我有三个文本框 txtId txtName txtPrice 和一个按钮 btnSearch 我的问题是 在 C 中 我只需在 txtI
  • DB2连接授权失败原因:Java不支持安全机制

    我正在尝试使用 DB2JDBC Type4 驱动程序配置 DB2 连接 但我收到这个错误 线程 main 中的异常 com ibm db2 jcc am SqlInvalidAuthorizationSpecException jcc t4
  • CloudKit 通过 cron 作业发送推送通知?

    我正在创建一个大学餐饮菜单应用程序 在其中我需要根据每日菜单发送推送通知 最初 我计划通过 Heroku 将用户数据存储在数据库中 并使用 cron 作业将数据库中的数据与每日菜单进行比较 并向用户发送适当的通知 然而 在 Cloudkit
  • 社交应用程序的数据库设计和优化注意事项

    通常的情况 我有一个简单的应用程序 允许人们上传照片并关注其他人 因此 每个用户都会有类似 墙 或 活动源 的东西 他或她可以在其中看到他 她的朋友 他或她关注的人 上传的最新照片 大多数功能都很容易实现 然而 当涉及到这个历史活动源时 由
  • 什么是数据库池?

    我只是想了解数据库连接池的概念以及它是如何实现的 数据库联系池是一种用于保持数据库连接打开的方法 以便其他人可以重用它们 通常 打开数据库连接是一项昂贵的操作 尤其是在数据库位于远程的情况下 您必须打开网络会话 进行身份验证 检查授权等等
  • fetchsize和batchsize对Spark的影响

    我想通过以下方式控制 RDB 的读写速度Spark直接 但标题已经透露的相关参数似乎不起作用 我可以得出这样的结论吗fetchsize and batchsize我的测试方法不起作用 或者它们确实会影响阅读和写作方面 因为测量结果基于规模是
  • 如何在不运行 PostgreSQL 服务器的情况下初始化 PostgreSQL 数据库

    在初始化脚本中 我想初始化 PostgreSQL 目录 但在此阶段不需要 也不希望 正在运行的 PostgreSQL 服务器 如果我只是创建集群 作为用户postgres initdb D 但是 我还需要创建 PostgreSQL 角色 创

随机推荐

  • C# EntityFrameworkCore 分页

    使用 public static PagedList
  • 深入浅出分析Electron自动升级electron-updater + electron-builder配置

    自动升级的方式有很多种 我们公司第一版是使用fs做文件的下载和替换 但是存在C programfile的权限问题 因此只好更换技术方案 使用Electron builder结合updater实现自动升级功能 一 electron build
  • mysql 取绝对值_自学MySQL第六天

    今天先学习了一些内置的numeric function 第一个ROUND 顾名思义近似 四舍五入的方式呈现数值 可以选保留几位小数 如图所示 第二个TRUNCATE 不用四舍五入 强行取指定位数小数 如图 第三个CEILING 返回大于括号
  • PCL学习笔记,区域生长分割(region growing segmentation)

    在本博文中 我主要介绍如何在pcl RegionGrowing类中调用区域增长算法 首先注意一点 这里是region growing segmentation 不是color based region growing segmentatio
  • 查询linux系统中空闲内存/内存使用状态查看/剩余内存查看

    查询linux系统中空闲内存 内存使用状态查看 剩余内存查看 本文作者 宗国锋 宗国锋官方网站 转载请注明原文链接 http www zongguofeng cn 2010 0223 272 html 下面介绍使用top和free命令查看系
  • 浅析Python heapq模块 堆数据结构

    堆的定义 堆是一种特殊的树形数据结构 每个节点都有一个值 通常我们所说的堆的数据结构指的是二叉树 堆的特点是根节点的值最大 或者最小 而且根节点的两个孩子也能与孩子节点组成子树 亦然称之为堆 堆分为两种 大根堆和小根堆是一颗每一个节点的键值
  • 2021-01-25

    项目在windows系统上运用jdk tomcat部署后 js页面不显示 有哪些原因 怎么解决
  • SQL语言的规则与规范

    SQL分类 SQ语言在功能上主要分为如下三大类 DDL Data Definition Laguage 数据定义语言 这些语言定义了不同的数据库 表 视图 索引等数据库对象 还用来创建 删除 修改数据库和数据表的结构 主要的语句关键字包括C
  • Ubuntu系统下配置 Qt Creator 输入中文、配置软件源的服务器地址、修改Ubuntu系统时间

    上篇介绍了Ubuntu系统下搭建QtCreator开发环境 我们可以发现安装好的QtCreator不能输入中文 也没有中文输入法供选择 这里需要进行设置 文章目录 1 配置软件源的服务器地址 2 先配置Ubuntu系统语言 设置为中文 3
  • C300--HGU ONU 配置思路指导_方式1

    OLT正常启动完成后 串口登录 ZXAN gt enable Password zxr10 ZXAN config t ZXAN config ZXAN config show onu type 查看ONU的注册模板 如ZTE F601 Z
  • 什么是全量表,增量表,快照表,拉链表?

    这一篇文章我们的目的是搞懂这四种表的概念 闲话不多说 直接看文字 全量表 全量表没有分区 表中的数据是前一天的所有数据 比如说今天是24号 那么全量表里面拥有的数据是23号的所有数据 每次往全量表里面写数据都会覆盖之前的数据 所以全量表不能
  • Ubuntu20.04 Server调整默认分辨率

    问题引入 把一台台式机安装成Ubuntu20 04 Server版本后 发现没有界面操作不方便 又给它装了个桌面 安装完后发现HDMI接到显示器的分辨率只有800 600 而且在系统配置里还不能选择其它的分辨率配置 首先怀疑是不是显卡驱动没
  • VS Code之Vue开发常用插件

    Auto Close Tag 自动补全html标签 Auto Rename Tag 同步更改html尾标签 ESLint ESlint语法提示 settings json 文件 eslint nodePath E WebStorm 应用路径
  • openwrt不支持opkg的解决办法

    opkg是openwrt的插件安装命令 类似Ubuntu上的apt get或者centos上的yum 好多采用openwrt系统的设备 最后都把opkg裁剪掉了 如果拿到一个设备又想用opkg安装网络上下载到的ipk包 应该怎么办呢 其实也
  • Fluent Nhibernate and Stored Procedures

    sql DROP TABLE Department GO CREATE TABLE Department Id INT IDENTITY 1 1 PRIMARY KEY DepName VARCHAR 50 PhoneNumber VARC
  • 【深度学习】最全的十九种损失函数汇总

    tensorflow和pytorch很多都是相似的 这里以pytorch为例 文章目录 一 L1范数损失 L1Loss 二 均方误差损失 MSELoss 三 交叉熵损失 CrossEntropyLoss 四 KL 散度损失 KLDivLos
  • 数仓建模宽表设计

    一 宽表的设计 其实宽表是数仓里面非常重要的一块 前面我们介绍过了维度表事实表 今天我们介绍一下宽表 前面我们说过了数仓是分层的 这是技术进步和时代变化相结合的产物 数仓的分层式为了更好地管理数仓以及更加高效地进行数据开发 宽表主要出现在d
  • 关于二进制的一个题目

    关于二进制的一个题目 猜测下面count的个数 test23d cpp 定义控制台应用程序的入口点 include stdafx h include
  • 【Copilot】GitHub Copilot could not connect to server. Extension activation failed: “read ECONNRESET“

    背景 搞了个Copilot 在VS里完美运行 但VScode里就一直报这个错误 GitHub Copilot could not connect to server Extension activation failed read ECON
  • 数据库锁表如何处理

    前段时间阿粉在公司开发的时候 不慎导致了数据库产生了锁表的操作 因为阿粉之前从来没有遇到过 之前只是了解过一点 所以导致了锁表 于是阿粉为了解决问题 研究了一下这一部分的内容 于是决定把这一块的知识分享给大家 数据库锁定机制 话说如果你只是