mysql锁总结

2023-10-31

参考文章

MySQL-死锁查询

事务与锁详解2

MySQL死锁系列-常见加锁场景分析

死锁的成因、场景以及死锁的避免

查询锁sql

1,查看当前的事务

SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;

2,查看正在锁的事务

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;

3,查看等待锁的事务

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

4,杀死进程id(就是上面命令的trx_mysql_thread_id列)

kill 661496

5、show open tables : 这条命令能够查看当前有那些表是打开的。In_use列表示有多少线程正在使用某张表,Name_locked表示表名是否被锁。

show open tables where in_use > 0;

这一般发生在Drop或Rename命令操作这张表时。故这条命令不能帮助解答我们常见的问题:当前某张表是否有死锁,谁拥有表上的这个锁等。

6、show processlist 显示哪些线程正在运行。status 显示状态。

show processlist
status 含义
locked 被其他查询锁住了。
User Lock 正在等待GET_LOCK()。
Killed 发送了一个kill请求给某线程,那么这个线程将会检查kill标志位,同时会放弃下一个kill请求。
Sending data 在处理SELECT查询的记录,同时正在把结果发送给客户端。
Sorting for group 正在为GROUP BY做排序。
Sorting for order 正在为ORDER BY做排序。
Removing duplicates 在执行一个SELECT DISTINCT方式的查询
Sleeping 正在等待客户端发送新请求。
Updating 正在搜索匹配的记录,并且修改它们。

更详细的status 请看 MySQL-死锁查询

7.杀死进程id(就是上面命令的id列)

kill 5

锁的类型

锁机制

共享锁(读锁):其他事务可以读,但不能写。

排他锁(写锁) :其他事务不能读取,也不能写。另外,为了允许行锁和表锁共存,实现多粒度锁机制,InnoDB还有两种内部使用的意向锁(Intention Locks),这两种意向锁都是表锁。

意向共享锁(IS):事务打算给数据行加行共享锁。事务在给一个数据行加共享锁前必须先取得该表的IS锁。
意向排他锁(IX):事务打算给数据行加行排他锁。事务在给一个数据行加排他锁前必须先取得该表的IX锁。

细粒度

行锁:对行锁定。开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

表锁:对整个表锁定。开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。

页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

锁算法

现在user表只要id=1,3,7, 10,13 有记录,如下:
在这里插入图片描述

记录锁 (Record Locks):锁定具体的记录

update user set name='张三'  where id=1

间隙锁(Gap Locks):锁定范围,主要是阻塞插入

1,where 是范围时,给一定范围的记录加锁。

select * from user where id>4 and id<7 for update

锁定范围 :id>4 and id<7

2,没有找到记录,给相邻的2记录范围的加锁。

update user set name='张三'  where id=6

锁定范围:id>4 and id<7

临键锁(Next-key Locks): 锁定范围加记录

select * from user where id>5 and id<9 for update

锁定范围:id>=4 and id<7 + id>=7 and id<10

事务与锁

数据库如果事务设置不合理,容易出现 脏读不可重复读幻读

脏读:事务A读取事务B正在修改且还没有提交的数据,如果事务B回滚,那事务A获取的数据就是错误的数据(脏数据)。

不可重复读:在事务中多次读取的结果不一样。如下:

步骤1:在事务A中第一次获取小明的分数90,

步骤2:恰巧事务B修改小明的分数为92并提交,

事务3,在事务A中需要再次读取小明的分数,结果是92

在同一个事务中,步骤1和步骤2的分数是不一样,这就是不重复读。

幻读:在事务中多次读取的记录数量不对。原因:在1次读取和第N次读取的期间中,有其他事务删除或新增了记录,

造成第N次的记录变多或变少。

事务的四种隔离级别

Read Uncommitted(未提交读,简称 RU) :事务未提交的数据对其他事务也是可见的,会出现脏读,不可重复读,幻读问题。

Read Committed(已提交读,简称 RC) :一个事务开始之后,只能看到已提交的事务所做的修改。解决脏读问题,会出现不可重复读 。

Repeatable Read(可重复读,简称 RR):在同一个事务中多次读取同样的数据结果是一样的,解决不可重复读,会出现幻读 。

Serializable(串行化) : 最高的隔离级别,通过强制事务的串行执行,解决所有问题。

事务隔离级别 脏读 不可重复读 幻读
未提交读 可能 可能 可能
已提交读 不可能 可能 可能
可重复读 不可能 不可能 InnoDB不可能,其他可能
串行化 不可能 不可能 不可能
快照读,当前读

快照读:读取的是记录数据的可见版本(可能是过期的数据),不用加锁。

当前读:读取的是记录数据的最新版本,并且当前读返回的记录都会加上锁(共享锁/排他锁),保证其他事务不会再并发的修改这条记录。

select :RC 总是读取记录的最新版本,而 RR 是读取该记录事务开始时的那个版本,虽然这两种读取的版本不同,但是都是快照数据,并不会被写操作阻塞,所以这种 读操作称为 快照读(Snapshot Read)。

其余操作是当前读,如下:

SELECT ... LOCK IN SHARE MODE:加共享(S)锁
SELECT ... FOR UPDATE:加排他(X)锁
INSERT / UPDATE / DELETE:加排他(X)锁

innodb默认隔离级别是RR。事务与锁的使用场景可以看MySQL死锁系列-常见加锁场景分析

死锁场景

死锁原因

当前线程拥有其他线程需要的资源

当前线程等待其他线程已拥有的资源

都不放弃自己拥有的资源

死锁场景

1,顺序死锁:加锁顺序不一致容易出现的死锁。如下:

商品进货

transaction begin
# 进货 goods.id=5 加排他锁
update goods set inventory=inventory + 10 where id=5 ;
# 扣钱 account.id=10 加排他锁
update account set inventory=inventory - 80 where id=10
transaction end

商品退货

transaction begin
# 赔钱 account.id=10 加排他锁
update account set inventory=inventory - 80 where id=10
# 进货 goods.id=5 加排他锁
update goods set inventory=inventory + 10 where id=5 ;
transaction end

如果商品进货,退货同时发生则容易死锁。解决方法:把 goods ,account 加锁顺序改成一致。

2,共享锁,排它锁死锁

transaction begin

select * from goods where id=5 lock in share mode ;

sleep(10)

update goods set inventory=inventory + 10 where id=5 ;

transaction end

上面伪代码并发时,容易死锁。

主动加锁

SELECT ... LOCK IN SHARE MODE:加共享(S)锁

SELECT ... FOR UPDATE:加排他(X)锁

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

mysql锁总结 的相关文章

  • MySQL - 从数字列表中选择在表的 id 字段中没有对应项的数字

    我有一个数字列表 例如 2 4 5 6 7 我有一个表 foos 带有 foos ID 包括 1 2 3 4 8 9 我想获取我的号码列表 并在我的表的 ID 字段中找到那些没有对应项的号码 实现此目的的一种方法是创建一个表格栏 在 ID
  • 显示和随机化 php 数组

    我有一个显示结果的数组 如下所示 Array 0 gt 71 1 gt 56 2 gt 64 3 gt 82 4 gt 90 5 gt 80 6 gt 65 7 gt 62 8 gt 14 9 gt 3 我的代码是 while row my
  • Tomcat 6找不到mysql驱动

    这里有一个类似的问题 但关于类路径 ClassNotFoundException com mysql jdbc Driver https stackoverflow com questions 1585811 classnotfoundex
  • 使用 MYSQL 将 h:mm pm/am 时间格式插入数据库

    我正在尝试将以 h mm am pm 格式写入的时间插入到存储为标准 DATETIME 格式 hh mm ss 的数据库中 但我不知道如何将发布的时间转换为标准格式所以数据库会接受它 这是我到目前为止一直在尝试的 title POST in
  • 使用用户定义函数 MySql 时出错

    您好 请帮我解决这个问题 提前致谢 我在数据库中定义了这些函数 CREATE FUNCTION levenshtein s1 VARCHAR 255 s2 VARCHAR 255 RETURNS INT DETERMINISTIC BEGI
  • 休眠以持久保存日期

    有没有办法告诉 Hibernate java util Date 应该持久保存 我需要这个来解决 MySQL 中缺少的毫秒分辨率问题 您能想到这种方法有什么缺点吗 您可以自己创建字段long 或者使用自定义的UserType 实施后User
  • mysql 不带空字符串和 NULL 的不同值

    如何检索没有空字符串值和NULL值的mysql不同值 SELECT DISTINCT CON EMAILADDRESS AS E MAIL FROM STUDENT INNER JOIN CONTACT CON ON STUDENT CON
  • MYSQL:如何在同一查询中联接两个表,两次引用同一个表

    我有两张桌子 我正在尝试将下面的示例两个表与表 1 引用表 2 两次结合起来 例如 如果我查看表 1 组 2 和成员 7 它应该查找表 2 中的 ID 并给出输出 Group Members Name Name 2 7 Blue Dog T
  • 重写 URL,将 ID 替换为查询字符串中的标题

    我对 mod rewrite 很陌生 但我做了一些搜索 但找不到这个问题的答案 我有一个网站 它只有一个 PHP 页面 根据查询字符串中传递给它的 ID 提供数十页内容 我想重写 URL 以便此 ID消失并替换为从数据库中提取的页面标题 例
  • MySQL 中 INDEX、PRIMARY、UNIQUE、FULLTEXT 之间的区别?

    创建MySQL表时PRIMARY UNIQUE INDEX和FULLTEXT有什么区别 我将如何使用它们 差异 KEY or INDEX指的是普通的非唯一索引 索引的非不同值是允许的 因此索引may索引的所有列中包含具有相同值的行 这些索引
  • MySQL 中的创建/写入权限

    我的设备遇到一些权限问题SELECT INTO OUTFILE陈述 当我登录数据库并执行简单的导出命令时 例如 mysql gt select from XYZ into outfile home mropa Photos Desktop
  • 删除、截断或删除以清理 MySQL 中的表

    我正在尝试清理表格 但没有摆脱表格的实际结构 我有一个id自动递增的列 我不需要保留ID号 但我确实需要它来保持其自动递增的特性 我发现了删除和截断 但我担心其中之一会完全删除整个表 从而使未来的插入命令变得无用 如何从表中删除所有记录以便
  • 限制分页页数

    objConnect mysql connect localhost root or die mysql error objDB mysql select db Test strSQL SELECT FROM UserAddedRecord
  • MySQL小写自动转换

    我有多个在数据库表中写入数据的 Web 服务 我想针对特定字段自动将大写字符串转换为小写字符串 mysql 有没有执行此任务的函数 假设这是表 id name language 有时 在语言字段内 Web 服务会写入大写字符串 IT 我想直
  • mysql 详细查询字符串,如通配符

    不知道如何标题我的问题 哈哈 下面是我需要的 我的数据库中的值如下所示 test example 1 test example 2 test example TD 1 这些值的长度可以不同 test example 只是一个示例 某些值将具
  • 连接 3 三张表

    我有这个图表应该可以解释我的情况 我需要一些关于连接 3 个表的帮助 我不知道如何做这种事情 因此 我可以通过执行以下操作来经历一段检索记录的 while 循环 img src alt Album AlbumID 使用内部联接 http w
  • ODBC 链接表中突然开始出现写入冲突消息

    我有一个 mySQL 数据库 用于跟踪我们的项目并驱动我们的网站显示其信息 为了方便更新数据库 我设置了一个使用 ODBC 连接 MySQL ODBC 5 1 来编辑数据的访问数据库 过去几个月一直运行良好 没有出现任何问题 然而 昨晚用户
  • 在 LINQ 中执行 FirstOrDefault 的替代方法

    我有一个成员资格表 用于记录用户是否是列表的成员 当用户的成员资格发生更新时 会写入新记录 并且先前的记录保持原样 从而可以维护其成员资格的历史记录 要获取用户的会员身份 需要选择他们最近的条目 下面是一些用户列表成员资格数据的示例 目的是
  • Mac OSX 10.6 上的 Python mysqldb 不工作

    我正在使用 Python 2 7 并尝试让 Django 项目在 MySQL 后端运行 我已经下载了 mysqldb 并按照此处的指南进行操作 http cd34 com blog programming python mysql pyth
  • 根据最大值连接表

    这是我正在谈论的内容的一个简化示例 Table students exam results id name id student id score date 1 Jim 1 1 73 8 1 09 2 Joe 2 1 67 9 2 09 3

随机推荐

  • 记录下FMDB的简单使用

    软件开发中常用到数据库 而移动开发中sqlite3是最常用的 IOS早就支持了sqlite数据库 由于直接使用sqlite操作数据库不太方便 于是有了很多基于系统sqlite封装的第三方库 FMDB就是其中非常出色的一个 他使用起来灰常简单
  • The MRC database dictionary之IMAG库 (imagery 象性)

    beach 667 jeep 659 telephone 655 sunshine 655 skunk 652 cranberry 649 steak 647 father 646 cigarette 645 banana 644 sunl
  • MySQL innoDB底层基础原理总结

    MySQL innoDB底层基础原理 前言 由于正在准备之后的实习面试 故总结了一部分MYSQL innoDB基础的问题 回答全为自己组织的语言 若有错各位大佬可及时指出 大家共同进步 谢谢 1 innoDB索引实现原理 innoDB存储引
  • 第二十一章、文件服务器之三: FTP 服务器

    FTP File Transfer Protocol 可说是最古老的协议之一了 主要是用来进行档案的传输 尤其是大型档案的传输使用 FTP 更是方便 不过 值得注意的是 使用 FTP 来传输时 其实是具有一定程度的 危险性 因为数据在因特网
  • 你可以简单的设计一下上面的订单管理系统吗

    当然可以 首先 订单管理系统通常包含以下几个主要功能 订单录入 用户可以在系统中输入新的订单信息 包括订单编号 订购商品的种类 数量 单价 总价等信息 订单查询 用户可以根据订单编号 商品名称 日期等信息查询订单 订单修改 用户可以修改已经
  • 编程网站:21 个学习网站推荐给你,大部分编程语言都在这里了

    本文精选了21个有关代码 编程 Java Python SQL Git 和Ruby on Rails学习的网站 这些网站为以下内容的学习提供了免费的优质资源 编程语言 Python和Java等 常用技术 SQL等 操作系统 Linux等 W
  • 编译器中和64位编程有关的预定义宏

    版权声明 本文为博主原创文章 未经博主允许不得转载 本文对分别测试VC MinGW GCC 三种编译器 32位和64位模式 共6种情况下 和64位编程有关的与预定义宏的值 对跨平台编程具有参考意义 Agner Fog 在他的 Calling
  • MyBatis学习(三)-- 实现关联查询

    文章目录 1 实现关联查询 1 1 创建教师表 1 2 创建班级表 1 3 创建学生表 2 创建与数据库表对应的实体类 2 1 创建教师实体类 2 2 创建学生实体类 2 3 创建班级实体类 3 创建班级映射器配置文件 4 修改配置文件 5
  • 【Linux初阶】Linux环境下的 git 使用

    hello 各位读者大大们你们好呀 系列专栏 Linux初阶 本篇内容 详细阐述git是什么 git的发展脉络 还有Linux环境下git工具的具体使用方法 作者简介 计算机海洋的新进船长一枚 请多多指教 目录 一 git是什么 二 git
  • 模块1--BH1750的应用(IIC)

    1 BH1750基本原理讲解 BH1750作为一款数字化的光照传感器 采用的是IIC接口 本篇文章主要是侧重BH1750的应用 关于IIC总线的时序原理 请大家自行学习 数字化的传感器 简单点理解即只要通信接口配置正确 即可读出数据 内部集
  • 微服务架构中不同微服务之间的接口调用

    假定系统管理微服务的实例名称为system 在系统管理中查询码表 api system codeTable queryDataDictionaryByDicCode 在自己的微服务中调用系统管理的查询码表接口写法如下 DataDiction
  • 初识OpenGL (-)VAO&VBO

    如何填充VBO 配置顶点属性指针以及如何把它们都储存到一个VAO里 step1 把颜色数据加进顶点数据中 eg 把颜色数据添加为3个float值至vertices数组 把三角形的三个角分别指定为红色 绿色和蓝色 float vertices
  • 批处理框架

    什么是批处理 在现代企业应用当中 面对复杂的业务以及海量的数据 除了通过庞杂的人机交互界面进行各种处理外 还有一类工作 不需要人工干预 只需要定期读入大批量数据 然后完成相应业务处理并进行归档 这类工作即为 批处理 为什么使用Spring
  • 数据分析和数据挖掘概述

    1 含义 数据挖掘 指从大量的数据中 通过统计学 人工智能 机器学习等方法 挖掘出未知的 且有价值的信息和知识的过程 数据分析 可分为广义的数据分析和狭义的数据分析 广义的数据分析就是包括狭义的数据分析和数据挖掘 而我们常说的数据分析指的是
  • 交叉编译工具的使用说明

    写在前面的话 由于已经学习了JZ2440V3开发板的裸机程序 想检验下学习成果 所以从今天开始把以前学的知识点在tiny4412开发板上面做个检验 裸机部分学习到把uboot移植完成就结束 然后 学习内核的驱动和其他子系统框架 言归正传 现
  • 阿里面试官:接口的幂等性怎么设计?

    一 什么是幂等 看一下维基百科怎么说的 幂等性 多次调用方法或者接口不会改变业务状态 可以保证重复调用的结果和单次调用的结果一致 二 使用幂等的场景 1 前端重复提交 用户注册 用户创建商品等操作 前端都会提交一些数据给后台服务 后台需要根
  • linux shell 正则表达式(BREs,EREs,PREs)差异比较

    http www cnblogs com chengmo archive 2010 10 10 1847287 html 正则表达式 在计算机科学中 是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串 在很多文本编辑器或其他
  • 笛卡尔树建树

    拿个单调队列维护 最后pop出来的就是它的左儿子 现在还在的 它是他的右儿子 int build int S N for int i 1 i lt n i while top T S top val lt T i val T i son 0
  • Markdown中显示矩阵运算过程

    发现这个神奇的用法 以后写博客就可以很好的演示矩阵乘法了 原文知乎 这里再分享一个可以把latex转成图片的在线网站quicklatex markdown 显示矩阵 from IPython display import display L
  • mysql锁总结

    参考文章 MySQL 死锁查询 事务与锁详解2 MySQL死锁系列 常见加锁场景分析 死锁的成因 场景以及死锁的避免 查询锁sql 1 查看当前的事务 SELECT FROM INFORMATION SCHEMA INNODB TRX 2