MySQL 行锁和表锁是什么?区别,作用等学习总结

一、所谓‘锁’ 是什么

个人理解,所谓的锁就是为了保证数据库数据操作的一致性而产生的一种机制,即我们可能有很多数据,但是当我们有多个人或者多个线程或会话对同一条数据或同一批数据执行操作时,可能大家都要修改这一部分数据,但为了保证单独一个人的操作在前后都保持一致而不被其他人在自己不知情的情况下中途又修改了数据而导致的与自己预期结果不一致而导致的问题。

二、MySQL 行锁以及表锁

MySQL 常用存储引擎的不同锁机制

MyISAMMEMORY采用 表级锁(table-level locking)

BDB 采用页面锁(page-level locking)或表级锁默认为页面锁

InnoDB支持行级锁(row-level locking)和表级锁默认为行级锁

MySQL 默认为 InnoDB 引擎,也就默认是行级锁

行锁特点

  1. 行锁是在数据行级别上进行的锁定,只锁定被访问的具体数据行,而不是整个表。
  2. 行锁可以同时允许多个事务并发地访问同一张表的不同行,提高了并发性能。
  3. 行锁的粒度更细,可以减少锁冲突,但也会增加锁管理的开销。
  4. 会出现死锁,发生锁冲突几率低,并发高。
  5. MySQL 的行锁是通过索引加载的,即是行锁是加在索引响应的行上,若对应 SQL 语句没有走索引则会全表扫描,行锁将变为表锁。

表锁特点

  1. 表锁是在整个表级别上进行的锁定,锁定整张表,而不是具体的数据行。
  2. 表锁只允许一个事务访问整个表,其他事务需要等待该事务释放锁才能访问。
  3. 表锁的粒度较大,可能会导致并发性能较差,特别是在高并发环境下。
  4. 不会出现死锁,发生锁冲突几率高,并发低。

行锁又分共享锁和排他锁

共享锁又称读锁
当一个事务对某几行上读锁时,允许其他事务对这几行进行读操作,但不允许其进行写操作,也不允许其他事务给这几行上排它锁,但允许上读锁。

排它锁又称写锁
当一个事务对某几个上写锁时,不允许其他事务写但允许读。更不允许其他事务给这几行上任何锁。包括写锁。
insert ,delete , update在事务中都会自动默认加上排它锁

共享锁写法:加 lock in share mode
例如:

SELECT ........ LOCK IN SHARE MODE

共享锁写法:加 for update
例如:

SELECT ........ FOR UPDATE

表级锁定分为表共享读锁(共享锁)表独占写锁(排他锁)

如何检测是否是行锁?
开启两个会话,在第一个会话中将事务级别改为不提交,然后读取某个范围内的数据。
然后在第二个会话中访问第一个会话中选中的数据,由于没有提交事务所以应该还是等待,无法执行的结果。
访问第一个会话中指定范围外的数据,如果立即成功说明不是表锁,是行锁,否则就是表锁。

通过show VARIABLES like “%innodb_lock_wait_timeout%” 查询当前mysql设置的锁超时时间,默认50秒。

通过set innodb_lock_wait_timeout = 60; 设置锁的超时时间为60秒。

三、死锁

假设目前我们有二十条数据,第一个事务先锁定了前十条,第二个事务锁定了后十条。
后来第一个事务开始申请访问后十条并锁定,阻碍了后十条的释放,而第二个事务也申请访问前十条并锁定,导致前十条无法释放,从而形成循环导致死锁问题。

如何避免

  1. 不同事务访问多个表时使用相同的顺序去访问,避免出现上下交叉导致中间死锁
  2. 简化事务,大事务变小事务,小事务考虑不使用事务。尽量走索引完成数据操作。使用等值查询,例如 id = XX 或 id IN (X1, X2, X3),减少使用 id > 或 < XXX的操作,避免间隙锁(见下方补充说明)
  3. 避免在同一时间有多个操作对同一张表或同一张表的相同数据做操作。

间隙锁:在条件查询如:where id > XXX,InnoDB会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内但并不存在的记录,叫做“间隙(GAP)”,间隙的目的是为了防止幻读

意向锁:意向锁分为 (意向共享锁)intention shared lock (IS) 和 (意向排他锁)intention exclusive lock (IX),意向锁的目的是表明有事务正在或者将要锁住某个表中的行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/807748.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

头歌-机器学习 第1次实验 Python机器学习软件包Scikit-Learn的学习与运用

第1关&#xff1a;使用scikit-learn导入数据集 scikit-learn包括一些标准数据集&#xff0c;不需要从外部下载&#xff0c;可直接导入使用&#xff0c;比如与分类问题相关的Iris数据集和digits手写图像数据集&#xff0c;与回归问题相关的波士顿房价数据集。 以下列举一些简单…

JAVA面试八股文之数据库

MySQL面试题 MySQL 存储引擎架构了解吗&#xff1f;CHAR 和 VARCHAR 的区别是什么&#xff1f;索引是越多越好嘛&#xff1f;MySQL数据库中空值&#xff08;null&#xff09;和空字符串&#xff08;&#xff09;的区别&#xff1f;SQL 中 on 条件与 where 条件的区别&#xff1…

mySql数据库学习003-多表查询

多表查询 创建数据表&#xff1a;班级表与学生表 create table if not exists class(id tinyint unsigned primary key auto_increment,name varchar(20) not null,description varchar(255),createAt timestamp default current_timestamp,updateAt timestamp default curre…

面试算法-171-翻转二叉树

题目 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1] 解 class Solution {public TreeNode invertTree(TreeNode root) {if (root n…

Leetcode【双指针法】

目录 一、left right在一个循环里 二、两个指针在各自的循环里 三、slow fast追逐型 四、slow fast条件型 双指针法常用与题型&#xff1a;数组、字符串、链表、N数之和 一、left right在一个循环里 left right在一个循环里。 left和right移动需要条件&#xff0c;一般是向…

腾讯云4核8G服务器多少钱?4核8G能干啥?

腾讯云4核8G服务器多少钱&#xff1f;腾讯云4核8G轻量应用服务器12M带宽租用价格646元15个月&#xff0c;活动页面 txybk.com/go/txy 活动链接打开如下图所示&#xff1a; 腾讯云4核8G服务器优惠价格 这台4核8G服务器是轻量应用服务器&#xff0c;详细配置为&#xff1a;轻量4核…

【2024年5月备考新增】冲刺(1)《第四版教材十五矩阵》

所谓十五矩阵,就是十大管理,五大过程组 【高项】信息系统项目管理师教程(第4版)十五矩阵知识领域项目管理过程组启动过程组规划过程组执行过程组监控过程组收尾过程组项目整合管理制定项目章程制订项目管理计划指导与管理项目工作监控项目工作结束项目或阶段管理项目知识实…

前端代码优化--computed

随便记录一下 主要是通过计算属性来简化和优化代码。在 Vue 中&#xff0c;计算属性是一种方便的工具&#xff0c;可以让你根据依赖状态的变化来动态计算衍生值。在这个例子中&#xff0c;我们使用计算属性 formattedCommunicationType 来根据 workDetail.realTimeItemDeviceDT…

node.js常用命令大全

命令用法nodenode [文件名]&#xff1a;运行指定的 Node.js 脚本文件&#xff1b; node --version&#xff1a;显示当前安装的 Node.js 版本号&#xff1b; node -h 或 node --help&#xff1a;显示 Node.js 的帮助信息。npmnpm install [模块名]&#xff1a;安装指定的 Node.j…

Scala之函数Day-2

Scala 函数(Function) 概述 将一段逻辑进行封装便于进行重复使用&#xff0c;被封装的这段逻辑就是函数。在Scala中&#xff0c;必须通过def来定义函数 基本语法 def 函数名(参数列表) : 返回值类型 {函数体return 返回值 }案例 // 案例&#xff1a;定义函数计算两个整数的…

openlayer实现webgis端绘制制图及编辑

在WebGIS端制图是指通过Web浏览器界面实现地理信息数据的可视化、编辑、分析以及地图产品的制作。这一过程通常涉及以下几个关键环节&#xff1a; **1. 前端技术栈&#xff1a; •HTML/CSS/JavaScript&#xff1a;作为Web开发的基础&#xff0c;用于构建用户界面布局、样式设…

Win11又来「重大」更新!

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了免费的人工智能中文站https://ai.weoknow.com 新建了收费的人工智能中文站ai人工智能工具 更多资源欢迎关注 Windows 11预览通道的22635.3420版本迎来了几个比较大的改进&#xff0c;主要有三个方面&#xff1a; …

一种快速移植 OpenHarmony Linux 内核的方法

移植概述 本文面向希望将 OpenHarmony 移植到三方芯片平台硬件的开发者&#xff0c;介绍一种借助三方芯片平台自带 Linux 内核的现有能力&#xff0c;快速移植 OpenHarmony 到三方芯片平台的方法。 移植到三方芯片平台的整体思路 内核态层和用户态层 为了更好的解释整个内核…

python-study-day1-(病人管理系统-带sql)

MainWindow代码 from tkinter import * from tkinter import messagebox from tkinter.ttk import Comboboxclass MianWindow(Frame):def __init__(self, masterNone):super().__init__(master, padx30, pady20)self.flag 0self.pack(expandTrue, fillBOTH)self.id StringVa…

深入OceanBase内部机制:系统架构与组件精讲

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 目录 1️⃣OceanBase 整体架构1.1 分区1.2 分片1.3 日志流1.4 对等节点1.5 多租户 2️⃣OceanBase 架构与组件详解2.1 存储层2.2 …

Disk Drill Enterprise for Mac v5.5.1515数据恢复软件中文版

Disk Drill 是 Mac 操作系统固有的Mac数据恢复软件&#xff1a;使用 Recovery Vault 轻松保护文件免遭意外删除&#xff0c;并从 Mac 磁盘恢复丢失的数据。支持大多数存储设备&#xff0c;文件类型和文件系统。 软件下载&#xff1a;Disk Drill Enterprise for Mac v5.5.1515激…

keepalived2.2.8+drbd9+nfs高可用存储部署

目录 一.本文基于上一篇文章keepalived环境来做的&#xff0c;主机信息如下 二.为两台虚拟机准备添加一块新硬盘设备 三.安装drbd9 1.使用扩展源的rpm包来下载 2.创建资源并挂载到新增的硬盘 3.主设备升级身份 4.主备两个设备手动切换身份演示 四.安装配置nfs 五.安装…

【YOLOv8】Yolov5和Yolov8网络结构的分析与对比

目录 一 YOLOv5 二 YOLOv8 yolo通常采用backbone-neck-head的网络结构。 Backbone 主要负责从输入图像中提取高层次的语义特征,常包含多个卷积层和池化层&#xff0c;构建了一个深层次的特征提取器。Neck通常用来进一步整合与调整backbone提取的特征&#xff0c;有利于将不同…

大话设计模式——24.迭代器模式(Iterator Pattern)

简介 提供一种方法顺序访问一个聚合对象中各个元素&#xff0c;而又不暴露该对象的内部实现。&#xff08;Java中使用最多的设计模式之一&#xff09; UML图 应用场景 Java的集合对象&#xff1a;Collection、List、Map、Set等都有迭代器Java ArrayList的迭代器源码 示例 简…

uniapp的h5项目 用命令起这个项目(vue-cli)

这里其实就相当于给uniapp h5套了一个vue-cli的壳&#xff08;纯属个人感觉&#xff09; 首先需要安装vue-cli 脚手架 npm install -g vue/cli然后创建项目&#xff08;这里需要在hbuilder创建&#xff09; vue create -p dcloudio/uni-preset-vue uniapp安装成功后它的结构…