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里的锁设置的更多相关文章

  1. 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 ...

  2. Hibernate原生SQL查询多表关联,SQL语句要注意的问题

    Hibernate原生SQL查询多表关联,SQL语句要注意的问题 @for&ever 2009-9-4 系统环境: MySQL5.1 Hibernate3.3 有如下的假定: 实体类 Ques ...

  3. SQL 2008 SP2 找不到SQL Server Engine

    原文:SQL 2008 SP2 找不到SQL Server Engine 最近我有个客户碰到一个很奇怪的问题.他安装SQL server 2008 SP2的时候, SP2的安装程序无法找到SQL se ...

  4. Oracle SQL操作计划基线总结(SQL Plan Baseline)

    一.基础概念 Oracle 11g開始,提供了一种新的固定运行计划的方法,即SQL plan baseline,中文名SQL运行计划基线(简称基线),能够觉得是OUTLINE(大纲)或者SQL PRO ...

  5. SQL反模式学习笔记21 SQL注入

    目标:编写SQL动态查询,防止SQL注入 通常所说的“SQL动态查询”是指将程序中的变量和基本SQL语句拼接成一个完整的查询语句. 反模式:将未经验证的输入作为代码执行 当向SQL查询的字符串中插入别 ...

  6. MySQL innodb中各种SQL语句加锁分析

    概要 Locking read( SELECT ... FOR UPDATE or SELECT ... LOCK IN SHARE MODE),UPDATE以及DELETE语句通常会在他扫描的索引所 ...

  7. SQL Server 2008 R2升级到SQL Server 2012 SP1

    1.建议对生产环境对的数据库升级之前做好备份,以防不测. 2.从SQL Server 2008 R2 升级到SQL Server 2012 SP1,需要先安装SQL Server 2008 R2 的S ...

  8. c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程

    c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...

  9. j接近50道经典SQL练习题,附建表SQL解题SQL

    说明 本文章整理了47道常见sql联系题,包括建表语句,表结构,习题列表,解题答案都涵盖在本文章内.文末提供了所用SQL脚本下载链接.所有解题答案都是本人自己写的,广大读者如果在阅读使用中,有任何问题 ...

随机推荐

  1. DFS深搜——Red and Black——A Knight&#39;s Journey

    深搜,从一点向各处搜找到全部能走的地方. Problem Description There is a rectangular room, covered with square tiles. Eac ...

  2. 【linux驱动】linux驱动总览

    欢迎转载,转载时需保留作者信息,谢谢. 邮箱:tangzhongp@163.com 博客园地址:http://www.cnblogs.com/embedded-tzp Csdn博客地址:http:// ...

  3. OC-多线程安全隐患及一般解决办法

    1.多线程的安全隐患1.1>一块资源可能被多个线程共享,也就是多个线程可能会访问同一块资源,如多个线程访问同一个对象,变量,文件等当多个线程访问同一块资源时,很容易引发数据错乱和数据安全问题1. ...

  4. 仿Google首页搜索自动补全

    仿Google自动补全,实现细节: 后台是简单的servlet(其实就是负责后台处理数据交互的,没必要非跌用个struts...什么的) 传输介质:xml 使用jQuery js框架 功能实现: 如果 ...

  5. C# 中 双问号??的用法

    int? x = null;int y = x ?? -1; 这里的y不能为null,但是等于x,x为null时赋值给y会报错.?? 可以在x==null时对y赋值-1 更多相关资料:https:// ...

  6. 基于visual Studio2013解决面试题之1306奇偶位数交换

     题目

  7. c#引用web.config中的ConnectionString

    c#引用web.config中的ConnectionString <connectionStrings>  <add name="JKXTConnectionString& ...

  8. js操作styleSheets

    document.styleSheets这个接口可以获取网页上引入的link样式表和style样式表.比如 最后的输出结果如下. 换下代码看看我们具体的styleSheets具体输出什么 这些都是次要 ...

  9. Python 学习入门(22)—— 线程同步

    Python主要通过标准库中的threading包来实现多线程.在当今网络时代,每个服务器都会接收到大量的请求.服务器可以利用多线程的方式来处理这些请求,以提高对网络端口的读写效率.Python是一种 ...

  10. Element.Event

    addEvent(type,fn):为DOM元素增加一个事件监听器 removeEvent(type,fn):移除先前为DOM元素添加的事件监听器 eg: var destroy = function ...