MySQL各类SQL语句的加锁机制
CREATE TABLE child (id int(11) NOT NULL, PRIMARY KEY(id)) ENGINE=InnoDB;
INSERT INTO child (id) values (90),(102);
--会话A执行:
start transaction;
INSERT INTO child (id) VALUES (101);
--会话B执行:
SELECT * FROM child WHERE id > 100 FOR UPDATE;
上述B会话显然会因为A会话在101上的行锁被阻塞,但是此时B会话本身的加锁状况呢?
不少人会认为B会话目前会持有三把行锁,其中一个是处于等待状态的(90,101]next-key行锁,剩下两个是已经获取资源完毕的id=102的行锁以及(102,supremum]的next-key行锁。但是实际上呢?show engine innodb status却显示会话B只持有2个行锁,且全部是next-key类型的。此时再开一个会话C查询id<50的范围会发现被阻塞了!!??为何查询小于90的范围也会被阻塞呢,因为会话B的语句扫描主键索引时先在(0,90]上加了next-key行锁,之后在(90,101]的资源上加锁却被阻塞了,这导致前一个(0,90]的锁未能释放,因为下一个范围锁未获取成功,这导致会话C查询小于90的范围失败,查询大于101的范围却能成功。
CREATE TABLE t1 (i INT, PRIMARY KEY (i)) ENGINE = InnoDB;
--会话A执行:
START TRANSACTION;
INSERT INTO t1 VALUES(1);
--会话B执行:
START TRANSACTION;
INSERT INTO t1 VALUES(1);
--会话C执行:
START TRANSACTION;
INSERT INTO t1 VALUES(1);
--最后会话A在执行:
ROLLBACK;
--最后发现会话B和C形成了死锁。
innodb_lock_wait_timeout参数来处理此种情况,
此类表锁甚至可以加在正在使用行锁的InnoDB表上。不过这并不会危及到事务的完整性,具体说明详见:https://dev.mysql.com/doc/refman/5.6/en/innodb-deadlock-detection.htmlMySQL各类SQL语句的加锁机制的更多相关文章
- 解决死锁之路3 - 常见 SQL 语句的加锁分析 (转)
出处:https://www.aneasystone.com/archives/2017/12/solving-dead-locks-three.html 这篇博客将对一些常见的 SQL 语句进行加锁 ...
- mysql 常用 sql 语句 - 快速查询
Mysql 常用 sql 语句 - 快速查询 1.mysql 基础 1.1 mysql 交互 1.1.1 mysql 连接 mysql.exe -hPup ...
- Mysql 常用 SQL 语句集锦
Mysql 常用 SQL 语句集锦 基础篇 //查询时间,友好提示 $sql = "select date_format(create_time, '%Y-%m-%d') as day fr ...
- Mysql 常用 SQL 语句集锦 转载(https://gold.xitu.io/post/584e7b298d6d81005456eb53)
Mysql 常用 SQL 语句集锦 基础篇 //查询时间,友好提示 $sql = "select date_format(create_time, '%Y-%m-%d') as day fr ...
- MySQL数据库sql语句的一些简单优化
1.查询条件的先后顺序 有多个查询条件时,要把效率高能更精确筛选记录的条件放在后边.因为MySQL解析sql语句是从后往前的(不知是否准确). 例: select a.*,b.* from UsrIn ...
- mysql下sql语句 update 字段=字段+字符串
mysql下sql语句 update 字段=字段+字符串 mysql下sql语句令某字段值等于原值加上一个字符串 update 表明 SET 字段= 'feifei' || 字段; (postgr ...
- MySQL数据库SQL语句基本操作
一.用户管理: 创建用户: create user '用户名'@'IP地址' identified by '密码'; 删除用户: drop user '用户名'@'IP地址'; 修改用户: renam ...
- mysql执行sql语句过程
开发人员基本都知道,我们的数据存在数据库中(目前最多的是mysql和oracle,由于作者更擅长mysql,所以这里默认数据库为mysql),服务器通过sql语句将查询数据的请求传入到mysql数据库 ...
- MySQL与SQL语句的操作
MySQL与SQL语句的操作 Mysql比较轻量化,企业用的是Oracle,基本的是熟悉对数据库,数据表,字段,记录的更新与修改 1. mysql基本信息 特殊数据库:information_sche ...
随机推荐
- Python numpy中矩阵的用法总结
关于Python Numpy库基础知识请参考博文:https://www.cnblogs.com/wj-1314/p/9722794.html Python矩阵的基本用法 mat()函数将目标数据的类 ...
- Yaml 文件中Condition If- else 判断的问题
在做项目的CI/ CD 时,难免会用到 Travis.CI 和 AppVeyor 以及 CodeCov 来判断测试的覆盖率,今天突然遇到了一个问题,就是我需要在每次做测试的时候判断是否存在一个环境变量 ...
- Javascript 定时器调用传递参数的方法
文章来源: https://m.jb51.net/article/20880.htm 备注:先记下,以后整理: Javascript 定时器调用传递参数的方法,需要的朋友可以参考下. 无论是wind ...
- sql多表数据查询
有时候在sql遇到一次查询多张表的全部数据例如:创建一张虚拟表A ,表A中需要有表B和表C的全部数据(表B和表C并集,如图) 有两种方法一种是使用: 1):union,不过这种查询速度比较慢 /* B ...
- 适用于WebApi的SQL注入过滤器
开发工具:Visual Studio 2017 C#版本:C#7.1 最有效的防止SQL注入的方式是调用数据库时使用参数化查询. 但是如果是接手一个旧的WebApi项目,不想改繁多的数据库访问层的代码 ...
- python之strip()小记
描述 Python strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列. 注意:该方法只能删除开头或是结尾的字符,不能删除中间部分的字符. 语法 strip()方法语法: ...
- [angularjs] angularjs系列笔记(八)事件
AngularJs有自己的HTML事件 ng-click指令 ng-click指令定义了AngularJs点击事件 当点击按钮的时候,赋值count变量并且给count变量加1,显示出count变量 ...
- 16.QT-QMap和QHash解析
QMap QMap原型为class QMap <K,T>,其中K表示键,T表示值,K和T属于映射关系. QMap会根据K来自动进行升序键排序 QMap中的K类型必须重载operator & ...
- JavaWeb学习日记----DTD
DTD:文档类型定义,可以定义合法的XML文档构建模块.使用一系列的合法标签元素来定义文档的结构. 现有一个XML文档内容如下: <?xml version="1.0"?&g ...
- SpringMVC 与 REST.
一.REST 的基础知识 我敢打赌这并不是你第一次听到或读到REST这个词.当讨论REST时,有一种常见的错误就是将其视为“基于URL的Web服务”—— 将REST作为另一种类型的RPC机制,只不过是 ...