14.3.3 Locks Set by Different SQL Statements in InnoDB 不同的SQL语句在InnoDB里的锁设置
14.3.3 Locks Set by Different SQL Statements in InnoDB 不同的SQL语句在InnoDB里的锁设置 locking read, 一个UPDATE,或者一个DELETE 通常设置record locks 在每个index record 它不关心 是否语句里的WHERE条件会排除记录 InnoDB 不记准确的WHERE 条件,只是知道哪个index ranges 会被扫描。 锁通常是next-key locks 会堵塞插入的区间。然而, gap locking 如果一个secondary index 是用于搜索,index record locks 设置为排它锁 InnoDB 也检索相应的clustered index records 在它们上面加锁 shared and exclusive locks 的区别 在14.3.1, “InnoDB Locking”.有描述 如果没有合适的索引对于你的语句,MySQL必须扫描整个表来处理语句, 表的每行记录都会被锁住,从而阻止所有行的插入。有必要创建合适的索引,因此你的查询不必要扫描很多的 行。 对于 SELECT ... FOR UPDATE or SELECT ... LOCK IN SHARE MODE,locks对于扫描的行是需要的, 期望被释放对于这些记录,不符合包含在结果集内的(比如,如果它们不符合WHERE条件的标准) 然而, 在有些情况下,记录不会马上解锁 因为结果行和它的源头之间的关系在查询执行间丢失了, 比如, 在一个UNION里,扫描的记录(或者被锁定的)记录可能被插入到一个临时表 InnoDB 设置指定的锁类型如下: SELECT ... FROM 是一个一致性读,读取一个数据快照,不加锁 除非事务隔离级别设置为SERIALIZABLE. 对于SERIALIZABLE 级别, SELECT ... FROM ... LOCK IN SHARE MODE 设置shared next-key locks 在所有的搜索的记录上。 对于搜索遇到的index recods,SELECT ... FROM ... FOR UPDATE 堵塞其他会话进行 SELECT ... FROM ... LOCK IN SHARE MODE 一致性读忽略任何的locks 设置在records上 UPDATE ... WHERE ... 设置一个排它的next-key lock 在搜索遇到的每条记录: 插入设置一个排它锁 在插入的行, lock是一个index-record 锁, 不是一个 next-key lock(that is, there is no gap lock) ,不阻止其他会话插入到这个区间(
在插入行前的区间) Session 1: mysql> mysql> show index from t5;
+-------+------------+----------+--------------+-------------+-----------+------------- +----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+----------+--------------+-------------+-----------+------------- +----------+--------+------+------------+---------+---------------+
| t5 | 0 | PRIMARY | 1 | sn | A | 10 | NULL | NULL | | BTREE | | |
| t5 | 0 | t5_idx1 | 1 | id | A | 10 | NULL | NULL | YES | BTREE | | |
+-------+------------+----------+--------------+-------------+-----------+------------- +----------+--------+------+------------+---------+---------------+
2 rows in set (0.00 sec) mysql> insert into t5(id,info) values(50,'a50');
Query OK, 1 row affected (0.00 sec) Session 2: mysql> insert into t5(id,info) values(50,'a50'); --Hang 在插入该行之前, gap锁类型被称为一个插入间隙锁 被设置。 这种锁发出信号意向插入以这样的方式, 多个事务插入到相同的index gap 不需要相互等待 如果它们不是插入相同的gap位置。 假设 这里有index records 值为4和7, 单独的事务尝试插入值5和6 每个都lock 4到7的区间 使用insert 意向锁来得到排它锁在插入的行, 但是不会互相堵塞 因为记录是不冲突的 如果一个重复键错误发生, 一个共享锁在重复index record 是被设置。 使用一个共享锁 可以导致死锁 有多个会话尝试插入相同的记录如果其他的会话已经有一个排它锁。 这个可能发生在如果session 删除了记录,假设InnoDB 表t1 有下面的结构; CREATE TABLE t1 (i INT, PRIMARY KEY (i)) ENGINE = InnoDB; 夹着 3个会话按顺序执行下面的操作: Session 1: START TRANSACTION;
INSERT INTO t1 VALUES(1);
Session 2: START TRANSACTION;
INSERT INTO t1 VALUES(1);
Session 3: START TRANSACTION;
INSERT INTO t1 VALUES(1);
Session 1: ROLLBACK; Session 1的操作需要一个记录的排它锁, Session 2和Session 3的操作都会导致重复键错误, 都需要一个记录的共享锁。 当Session 1回滚,它释放它的记录上排它锁,排队的共享锁请求对于session 2和session 3被授权。 在这点上,session 2和3 死锁:没有一个能获得排它锁 因为被其他会话获得了共享锁 类似的情况发生 如果表已经包含 键值为1的记录, 3个会话按顺序执行下面的操作: Session 1: START TRANSACTION;
DELETE FROM t1 WHERE i = 1;
Session 2: START TRANSACTION;
INSERT INTO t1 VALUES(1);
Session 3: START TRANSACTION;
INSERT INTO t1 VALUES(1);
Session 1: COMMIT; session 1的第一个操作需要一个记录的排它锁, session 2和3的操作都会导致一个重复键错误, 它们都请求一个记录的共享锁。当Session 1提交时,它释放太的排它锁 等待共享锁请求的对于session 2和3是被授权,在这个时间点,session 2和3死锁, 没有一个能获得排它锁 因为共享锁被其他会话占有 1.INSERT ... ON DUPLICATE KEY UPDATE 不同于简单的插入 一个排它 next-key lock 而不是一个共享锁 被放置在记录上 2.REPLACE 是像一个INSERT 如果没有冲突在一个唯一键上, 否则,一个排它的next-key lock 是被放置在记录上:
14.3.3 Locks Set by Different SQL Statements in InnoDB 不同的SQL语句在InnoDB里的锁设置的更多相关文章
- 14.5.3 Locks Set by Different SQL Statements in InnoDB
14.5.3 Locks Set by Different SQL Statements in InnoDB 通过不同的SQL语句设置的锁 在InnoDB中 一个锁定读, 一个UPDATE 或者一个D ...
- Hibernate原生SQL查询多表关联,SQL语句要注意的问题
Hibernate原生SQL查询多表关联,SQL语句要注意的问题 @for&ever 2009-9-4 系统环境: MySQL5.1 Hibernate3.3 有如下的假定: 实体类 Ques ...
- SQL 2008 SP2 找不到SQL Server Engine
原文:SQL 2008 SP2 找不到SQL Server Engine 最近我有个客户碰到一个很奇怪的问题.他安装SQL server 2008 SP2的时候, SP2的安装程序无法找到SQL se ...
- Oracle SQL操作计划基线总结(SQL Plan Baseline)
一.基础概念 Oracle 11g開始,提供了一种新的固定运行计划的方法,即SQL plan baseline,中文名SQL运行计划基线(简称基线),能够觉得是OUTLINE(大纲)或者SQL PRO ...
- SQL反模式学习笔记21 SQL注入
目标:编写SQL动态查询,防止SQL注入 通常所说的“SQL动态查询”是指将程序中的变量和基本SQL语句拼接成一个完整的查询语句. 反模式:将未经验证的输入作为代码执行 当向SQL查询的字符串中插入别 ...
- MySQL innodb中各种SQL语句加锁分析
概要 Locking read( SELECT ... FOR UPDATE or SELECT ... LOCK IN SHARE MODE),UPDATE以及DELETE语句通常会在他扫描的索引所 ...
- SQL Server 2008 R2升级到SQL Server 2012 SP1
1.建议对生产环境对的数据库升级之前做好备份,以防不测. 2.从SQL Server 2008 R2 升级到SQL Server 2012 SP1,需要先安装SQL Server 2008 R2 的S ...
- c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程
c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...
- j接近50道经典SQL练习题,附建表SQL解题SQL
说明 本文章整理了47道常见sql联系题,包括建表语句,表结构,习题列表,解题答案都涵盖在本文章内.文末提供了所用SQL脚本下载链接.所有解题答案都是本人自己写的,广大读者如果在阅读使用中,有任何问题 ...
随机推荐
- 科尔尼咨询公司 - MBA智库百科
科尔尼咨询公司 - MBA智库百科 科尔尼公司简介 科尔尼管理咨询公司(A.T. Kearney)于1926年在芝加哥成立,经过80多年的发展,科尔尼咨询已发展为一家全球领先的高增值管理咨询公司,科尔 ...
- Android核心基础(十一)
1.Android的状态栏通知(Notification) 通知用于在状态栏显示消息,消息到来时以图标方式表示,如下: //获取通知管理器 NotificationManager mNotificat ...
- HTML简单介绍及举例
超文本标记语言(Hyper Text Markup Language,简称HTML)是为"网页创建和其他可在网页浏览器中看到的信息"设计的一种标记语言.HTML被用来结构化信息,也 ...
- javascript 浏览器兼容性写法
var event = window.event || arguments.callee.caller.arguments[0]; // 获取event对象 event = event.srcElem ...
- 【Unity技巧】使用单例模式Singleton
这几天想把在实习里碰到的一些好的技巧写在这里,也算是对实习的一个总结.好啦,今天要讲的是在Unity里应用一种非常有名的设计模式——单例模式. 开场白 单例模式的简单介绍请看前面的链接,当然网上还有很 ...
- 二维码闪电登录流程详解,附demo(1/2)
二维码,最早发明于日本,它是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设 ...
- 第12届北师大校赛热身赛第二场 B起床的烦恼
题目链接:http://www.bnuoj.com/bnuoj/contest_show.php? cid=3570#problem/43572 题目大意: Nono从一開始数数,他每数一个数时会计算 ...
- POJ - 1422 Air Raid 二分图最大匹配
题目大意:有n个点,m条单向线段.如今问要从几个点出发才干遍历到全部的点 解题思路:二分图最大匹配,仅仅要一条匹配,就表示两个点联通,两个点联通仅仅须要选取当中一个点就可以,所以有多少条匹配.就能够减 ...
- java web解决表单重复提交问题
我们大家再进行web开发的时候,必不可少会遇见表单重复提交问题.今天就来给总结如何解决表单提交问题,欢迎大家交流指正. 首先我们在讨论如何解决表单重复提交问题之前先来解决三个问题:1.什么叫表单重复提 ...
- Eclipse完美汉化教程
首先我们打开http://www.eclipse.org/babel/downloads.php下载语言包. 方法一:可以复制图片里的地址通过Eclipse下载,Help→Install New So ...