mysql——锁

2023-11-13

三种锁问题

1.丢失修改:火车票问题,让第一个人丢失了修改
2.不可重复读(幻象):第二次读会读到不正确的数据(一个事务读到另一个已提交的事务)
3.读“脏”数据:A修改值后又回滚,B读到修改后的值,即脏数据;或者是一个事务读到了另一个事务未提交的数据

阻塞

定义:一个事务等待另一个事务开锁(释放占用的资源)
控制等待的时间:set @@nnodb_lock_wait_timeout=60;
设定事务在等待超时时是否回滚:set @@innodb_rollback_on_timeout=on;
(默认是off,代表不回滚)

死锁

定义:A等B开锁,B等A开锁,两个在互相等待
解决方法:1、超时后对事务回滚,参数innodb_lock_wait_timeout设置超时的时间
2、用wait-for graph进行死锁检测

解决三种问题的方案

1、读操作使用多版本并发控制**(MVCC)**,写操作加锁:生成readview,查询语句只能读生成readview之前已经提交的更改(read committed和repeatable read就是用这个方法),mvcc也称为一致性非锁定读
2、读、写操作都加锁

隔离级别

1、read uncommitted:脏读,不可重复读,幻读都可能发生
2、read committed:不可重复读,幻读可能发生,脏读不可能发生
3、repeatable read:幻读可能发生,脏读和不可重复读不可能发生
4、serializable:上述现象都不可能发生
(以上都是不加锁的情况)

锁定读

1、共享锁:S锁 select…lock in share mode(对读取的数据加S锁)
2、独占锁:X锁 select…for update(对读取的数据加X锁)
S锁和S锁是兼容的,其他都不兼容,会阻塞

加锁语句只有这两三句,但是根据事务的隔离级别,索引类型等条件会产生不同的锁。在隔离级别不大于read committed(read uncommitted、read committed)会为当前记录加正经记录锁。在隔离级别不小于repeatable read(repeatable read、serializable)会为当前记录加next-key锁

写操作

即delete,update,insert
delete:先在B+树中定位到这条记录的位置,然后获取这条记录的X锁,最后再执行delete mark操作
update:同理
insert:新插入的一条记录受隐式锁保护,不需要在内存中生成对应的锁结构

多粒度锁

分几个层次:库,表,页,行
表加锁就是粒度比较粗,占用资源少
行加锁就是粒度最细的,可以实现更精准的并发控制,但是占用资源大

意向共享锁:IS锁,事务给某条记录加S锁前,要在表级别加个IS锁
意向独占锁:IX锁,事务给某条记录加X锁前,要在表级别加个IX锁
作用:方便判断表中的记录是否有被上锁,避免用遍历的方式查看表中是否有被上锁
IX和S不兼容,X都不兼容

行级锁类型

1、record lock
名称:lock_rec_not_gap
记录锁:把一条记录锁上
即上述的S锁和X锁

2、gap lock
名称:lock_gap
gap锁:不允许别的事务在一条记录前的间隙插入新记录
作用:防止插入幻影记录

3、next_key lock
名称:lock_ordinary
next-key锁:是record锁和gap锁的合体,即保护该条记录,又防止别的事务对被保护记录前的间隙插入记录

4、隐式锁
insert语句是不需要在内存中生成锁结构
解释:一个事务对新插入的记录不加锁,别的事务要对这条记录加锁时,由于有隐式锁的存在,会给当前事务生成一个锁结构,在给另外一个事务生成一个锁结构,然后“另外一个事务”进入等待状态
投机取巧:不用时可以不加,它自己用时自己加

查看事务加锁情况

使用innodb_trx表
select * from information_schema.innodb_trx\G

使用innodb_locks表
select * from information_schema.innodb_locks;

使用innodb_lock_waits表
select * from information_schema.innodb_lock_waits;

使用show engine innodb status

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

mysql——锁 的相关文章

  • LeetCode【345】反转字符串中的元音字母

    题目 编写一个函数 以字符串作为输入 反转该字符串中的元音字母 示例 1 输入 hello 输出 holle 示例 2 输入 leetcode 输出 leotcede 说明 元音字母不包含字母 y public class LeetCode
  • linux system call

    1 SYSCALL DEFINE4 reboot 2 int magic1 3 int magic2 4 unsigned int cmd 5 void user ang 6 7 if capable CAP SYS BOOT 8 retu
  • python数据分析练习题

    本次作业尝试使用ipython和jupyter的notebook功能来实现py代码 首先是要配置环境 通过命令 pip install ipython pip install jypyter ipython notebook 配置并打开no

随机推荐

  • [机器学习]1.2虚拟环境&基础包安装初始化

    机器学习 第一章 Centos环境安装初始化 第二章 virtualenv及基础包环境安装初始化 机器学习 1 2虚拟环境 基础包安装初始化 机器学习 前言 一 python安装 二 pip3 virtualenv安装及环境变量配置 1 配
  • 08 FPGA—计数器与分频器的应用

    1 理论 时序逻辑电路中最基本的单元 寄存器 我们可以使用寄存器来做计数器 基本上关于时间的设计都离不开计数器 计数器在数字系统中主要是对脉冲的个数进行计数 以实现测量 计数和控制的功能 同时兼有分频功能 计数器一般都是从 0 开始计数 计
  • 第四章-图像加密与解密

    加密与加密原理 使用异或运算实现图像加密及解密功能 异或运算规则 相同为0 不同为1 运算数相同 结果为0 运算数不同 结果为1 任何数 0 1 与0异或 结果仍为自身 任何数 0 1 与1异或 结果为另外一个数 即0变1 1变0 任何数和
  • Ubuntu查看系统日志的几种方法

    在 Ubuntu 22 10 中 你可以查看系统日志来排查错误 以下是几种查看日志的方法 一 Journalctl 命令 使用 journalctl 命令可以查看系统日志信息 包括引起闪退的错误信息 你可以运行以下命令来查看最新的系统日志
  • GDAL根据Shape文件切图(java)

    目地 用Java实现类似QGIS中 按掩膜图层裁剪栅格 的功能 其实QGIS本身调用的就是gdalwarp exe 官方文档 https gdal org programs gdalwarp html gdalwarp gdalwarp h
  • js == 运算规则解析

    1 先了解一下基本类型和复杂类型划分的依据 JS中的值有两种类型 原始类型 Primitive 对象类型 Object 原始类型包括 Undefined Null Boolean Number和String等五种 这两大类别的数据存储方式是
  • 启明智显分享

    提示 作为Espressif 乐鑫科技 大中华区合作伙伴及sigmastar 厦门星宸 VAD合作伙伴 启明智显不仅用心整理了你在开发过程中可能会遇到的问题以及快速上手的简明教程供开发小伙伴参考 同时也用心整理了乐鑫及星宸科技的新产品 新方
  • 软文营销研究目标关键词让内容简单明了

    随着行业的发展 许多企业正在进入文案领域 对于喜欢写作的人来说 这是一条很好的道路 但对某些人来说也可能具有挑战性 一些初学者可能会觉得自己没有写作能力达不到标准 因此本文178软文网小编将帮你决定并学习如何成写出一篇成功有效的文案 一 向
  • yolov3整体工作流程(个人理解,欢迎纠正和补充)

    以下内容纯属个人理解 请路过的小伙伴留下宝贵意见 欢迎纠正和补充 谢谢 yolov3的总体思想归纳 首先 将输入图片压缩到416 416 通过特征提取网络 Darknet53 without FC layer 对输入图像提取特征得到大小一定
  • ubuntu下设置网络

    修改文件 etc network interfaces 命令 sudo vi etc network interfaces 或 sudo gedit etc network interfaces 我的配置如下 interfaces 5 fi
  • QT的信号槽的四种写法和五种链接方式

    目录 四种信号槽写法 五种连接方式 实例 常见错误及改正 错误1 未连接信号与槽 错误2 信号和槽参数不匹配 错误3 未使用Q OBJECT宏 错误4 跨线程连接未处理 在Qt中 信号 Signal 和槽 Slot 是一种用于对象之间通信的
  • 对于搞钱我们是认真的

    前言 大家好 我是xiezhr 一提到搞钱 想必大家都非常非常感兴趣 立马就精神抖擞了 说实话 在这疫情爆发这几年里 赚点钱真不容易 不知道你是不是也跟我一样 一个人在夜深人静的时候就在想怎么才能通过自己程序员的身份来搞钱呢 今天 我们就来
  • 基于JAVA的图书馆书库管理系统

    源码下载 https wwa lanzous com iMbYtmlznri 更多源码 http byamd xyz 论文
  • 数学建模课程

    数学规划模型 2020 3 7 1 数学规划 简称最优化问题 2 最优化问题的数学模式的一般形式 三个要素 决策变量 目标函数 约束条件 所确定的x的范围为 可行域 满足 2 的解 可行解 同时满足 1 2 最优解 整个可行域上 全局最优解
  • TensorFlow2.x,GPU代码测试

    TensorFlow2 x GPU代码测试 代码如下 import tensorflow as tf import os os environ TF CPP MIN LOG LEVEL 2 不显示等级2以下的提示信息 print GPU t
  • 测试开发工程师需要掌握什么技能?

    如何理解测试开发 有人问测试开发是测试还是开发 本质上来说 还是测试 因为测试是核心 开发是手段 那么说 成为测试开发 需要那些必备的技能呢 不同level的测试工程师应具备的基本技能第一个 我们称之为测试员 测试工程师 直白一点说 就是干
  • pandas学习笔记(三)---重建索引与处理缺失值

    本文介绍pandas中重建索引与处理缺失值 文章目录 一 重建索引 1 1series重建索引 1 2 dataframe重建索引并修改缺失值 二 处理缺失值 2 1丢掉含有缺失值的行或者列 2 2 填充缺失值 2 3判断df中每个元素是否
  • QT设置背景图片的3种方式 & 区别——设置样式表styleSheet

    方式1 修改MainWindow主窗口 的 styleSheet 1 效果图 工具栏和状态栏 也加了背景 参考链接https blog csdn net mozai147 article details 84112744 2 选中编辑Mai
  • Angular学习笔记69:Angular项目的单元测试 -- 对服务进行测试

    对服务进行测试 服务通常是单元测试中最简单的文件类型 对于简单 没有其他依赖的服务 对于一个没有其他依赖的服务 Mock 一些数据 进行测试即可 例如 对于一个公共数据处理的服务 import Injectable from angular
  • mysql——锁

    三种锁问题 1 丢失修改 火车票问题 让第一个人丢失了修改 2 不可重复读 幻象 第二次读会读到不正确的数据 一个事务读到另一个已提交的事务 3 读 脏 数据 A修改值后又回滚 B读到修改后的值 即脏数据 或者是一个事务读到了另一个事务未提