14.5.3 Locks Set by Different SQL Statements in InnoDB

通过不同的SQL语句设置的锁 在InnoDB中

一个锁定读, 一个UPDATE 或者一个DELETE 通常设置record locks 在每个Index record 

他不管是否有WHERE 条件在与距离 会排除记录。

InnoDB 不记住准确的WHERE 条件, 只是知道哪个index range 是被扫描。

locks通常是 next-key locks 也堵塞inserts 到"gap" 在那个记录前。

然而,区间锁可以显示的关闭,这将导致 next-key locking不能被使用

如果一个secondary index 是用于一个搜索,index record locks 会被设置为排他。

InnoDB 也会检索相应的clustered index records 在它们上面设置锁

如果你没有合适的索引用于你的语句,MySQL 必须扫描整个表来处理语句,表的每行记录都会被锁定,

从而阻止其他用于所有的插入到这个表。

创建好的索引是重要的,这样你的查询不会扫描很多的记录

对于SELECT ... FOR UPDATE or SELECT ... LOCK IN SHARE MODE, 锁是需要的对于扫描的记录

期望被释放对于记录不符合纳入结果集的( 比如,如果你不满足给定的WHERE 条件的标准).

然而, 在一些例子中,记录可能不会被立即锁定 因为一个结果集和他的原始资料的关系是丢失了再查询执行时。

比如,在一个UNION 扫描的(被锁定的)的记录从一个表可能会被插入到一个临时表 

InnoDB 设置锁的特定类型:

1.SELECT ... FROM  是一个一致性读, 从数据库读取快照 没有设置锁除非事务隔离是设置为SERIALIZABLE

对于SERIALIZABLE level,搜索设置共享的next-key locks  在index records.

然而,只有Index record lock 是需要的 用于语句 锁定记录使用一个unique index 来搜索唯一行

2.SELECT ... FROM ... LOCK IN SHARE MODE 设置共享next-key locks 在所有的搜索遇到的index 记录。

然而, 只有一个index record lock 是需要的用于语句 锁定记录使用一个unique index 来搜索唯一的记录

3.SELECT ... FROM ... FOR UPDATE 设置一个排他的 next-key lock 在每条搜索遇到的记录。

然而, 只有一个Index record lock 是需要的用于语句 locks rows 使用一个唯一索引来搜搜唯一的记录

4.对于搜搜遇到的index records,

SELECT ... FROM ... FOR UPDATE 堵塞其他会话 执行SELECT ... FROM ... LOCK IN SHARE MODE

或者 在某些事物蛤蜊级别。

一致性读 会忽略任何锁定

5.UPDATE ... WHERE ...  设置一个排他的e next-key lock 在每个记录。

然而, 只有一个Index record 锁是需要的用于语句当locks row 是使用一个唯一索引来进行唯一搜索

6.当UPDATE 协议一个clustered index record, 隐式的锁是被设置影响secondary index records.

UPDATE 操作也会设置shared locks 在影响的secondary index records 当执行重复的检查扫描

7.DELETE FROM ... WHERE ... 设置一个排他的 next-key lock 在每个搜索遇到的记录

然而,只有一个index record lock 是需要的用于语句 lock rows 使用一个唯一索引来搜索一个唯一的记录

8.在插入行之前,一种区间锁类型被称为insert intention gap lock 被设置。

lock 表明意向插入以这种方式多个事务插入到相同的index gap 不需要相互等待

如果他们不是插入相同的位置。

假设有index record 值为4和7,单独的事务尝试插入值5和6 每个lock 区间在4和7 使用插入意向锁来得到排他锁在插入的记录,

但是不会相互堵塞 因为记录是不冲突的

如果一个重复的key错误发生,一个共享锁在重复的index上被设置。

这个共享的锁可以导致死锁 有多个会话尝试插入相同的记录 如果另外的会话已经有一个排他锁。

这个可以发生如果另外的会话删除记录 ,假设一个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); --hang Session 3: START TRANSACTION;
INSERT INTO t1 VALUES(1); Session 1: ROLLBACK; Session 1的第一个操作 需要的排他锁用于记录, session 2和session 3 都导致一个重复键错误 他们都请求一个共享锁用于记录。 当session 1回滚, 它释放他的排他锁在记录上 共享锁请求对于session 2和3 是被授予。 在这个时间点,sessions 2 and 3 deadlock: 两者都不能获得一个排他锁用于记录 因为共享锁被其他持有 类似的情况发生 如果表已经包含一个只为1 ,然后3个会话执行相同的操作: mysql> select * from t1;
+---+
| i |
+---+
| 1 |
+---+
1 row in set (0.00 sec) 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 和session 3 操作都导致一个重复键错误 他们都请求记录的排他锁。 当session 1提交, 他释放他的排他锁在记录上 session 2和session 3请求的共享锁被授权。 在这个时间点,session 2和session 3死锁 两者都不能获得一个排他锁对于记录 因为共享锁被另外一个人持有 1.?INSERT ... ON DUPLICATE KEY UPDATE 不同一个简单的插入 一个排他next-key lock 而不是一个共享锁 2.REPLACE 是像一个INSERT 如果没有冲突在一个唯一键。 否则,一个排他的next-key lock是放置在replaces 的记录上 3.INSERT INTO T SELECT ... FROM S WHERE ... 设置一个排他锁 record lock(没有间隙锁) 在每个插入的记录。 如果事务隔离级别是READ COMMITTED,或者 innodb_locks_unsafe_for_binlog 是被启用的 且事务隔离级别不是SERIALIZABLE, CREATE TABLE ... SELECT ... 执行SELECT YOU shared next-key locks 或者作为一个一致性读,和 INSERT ... SELECT. 当初始化一个先前指定的 AUTO_INCREMENT 列在一个表上, InnoDB 设置一个排他锁在 索引相关自增列的尾部。

14.5.3 Locks Set by Different SQL Statements in InnoDB的更多相关文章

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

  2. Locks Set by Different SQL Statements in InnoDB

    A locking read, an UPDATE, or a DELETE generally set record locks on every index record that is scan ...

  3. How to executing direct SQL statements [Axapta, AX4.0, AX2009, AX2012]

    Today I want to talk about executing SQL statements in X++ on both the current AX database and exter ...

  4. 14.2.5.1 Role of the .frm File for InnoDB Tables InnoDB .frm文件的作用

    14.2.5.1 Role of the .frm File for InnoDB Tables: 14.2.5.1 Role of the .frm File for InnoDB Tables I ...

  5. Save results to different files when executing multi SQL statements in DB Query Analyzer 7.01

        1 About DB Query Analyzer DB Query Analyzer is presented by Master Genfeng,Ma from Chinese Mainl ...

  6. Access text files using SQL statements by DB Query Analyzer

    Access text files using SQL statements by DB Query Analyzer Ma Gen feng (Guangdong Unitoll Services ...

  7. (8)MySQL进阶篇SQL优化(InnoDB锁-共享锁、排他锁与意向锁)

    1.锁的分类 锁(Locking)是数据库在并发访问时保证数据一致性和完整性的主要机制.之前MyISAM锁章节已经讲过锁分类,而InnoDB锁按照粒度分为锁定整个表的表级锁(table-level l ...

  8. (11)MySQL进阶篇SQL优化(InnoDB锁问题排查与解决)

    1.概述 前面章节之所以介绍那么多锁的知识点和示例,其实最终目的就是为了排查与解决死锁的问题,下面我们把之前学过锁知识重温与补充一遍,然后再通过例子演示下如果排查与解决死锁. 2.前期准备 ●数据库事 ...

  9. iOS开发之SQLite-C语言接口规范(二) —— Prepared Your SQL Statements

    在<SQLite的C语言接口规范(一)>中介绍了如何去连接打开数据库,本篇博客就介绍如何操作数据库,本篇主要给出了如何执行数据库查询语句(Select), 然后遍历结果集.本篇博客就直接使 ...

随机推荐

  1. Qt XML读取写入操作

    XML(eXtensible Markup Language,可扩展标记语言)是普通用于数据交换和数据存储的一种多用途文本文件格式: SVG(可标量矢量图形)XML格式,QtSvg模块提供了可用于载入 ...

  2. 如何将你的程序打包成ipa

    ios打包 把需要安装这个app的设备的证书导入xcode中 Archive打包ipa 将打包得到的文件打开,并且显示包内容 找到有相关图标的文件,文件上面有一个禁止符号 将这个文件,拖到itunes ...

  3. Gitolite轻松部署/管理git server

    对于今天越来越受欢迎的Git,相信做开发的朋友都基本有所耳闻.它最大的便利就是分布式的开发库,让使用git作为源码管理库的开发者可以在本地提交代码的修改而不用提交到远程的库,同时需要和团队协作.同步代 ...

  4. 动态代理与AOP

    1. 代理的分类: 静态代理:每个代理类只能为一个接口服务 动态代理:可以通过一个代理类完成全部的代理功能(由JVM生成实现一系列接口的代理类,即:生成实现接口的类的代理) 2. 动态代理: 在Jav ...

  5. 10.25 noip模拟试题

    今天题目略水2333 依旧不粘题目了23333 T1 /*数学题 给定n个斜率 求有多少个三元组 保证两两斜率不同 ans=C(n,3)-ΣC(len[i],2)*(n-len[i])-ΣC(len[ ...

  6. 当升级新版本的时候,从新加载新版本的js的方法

    <script src="../Script/SmcScript.js?version='<%=Smc20.Web.WebForm.Public.WebConst.WEBJSCA ...

  7. SQL存储过程基于字段名传入的字符串拼接.

    --定义存储过程. Create PROCEDURE Usp_Static ), ), --分组字段. ), --统计字段. ), --表头字段. ) --聚会函数. AS ) --存储游标执行的列. ...

  8. 关于 Repository和UnitOfWork 模式的关系

    本以为,关于这方面的理解,园子中的文章已经很多的了,再多做文章真的就“多做文章了”,但是最近发现,还是有必要的,首先,每个人对于同一事物的理解方式和出发点都是不同的,所以思考的方式得到结果也是不同的. ...

  9. java.lang.ClassCastException: java.math.BigDecimal cannot be cast to java.lang.String

    http://blog.csdn.net/agileclipse/article/details/17161225 详情请点击链接查看

  10. JSONKit 在iOS9 arm7 64位下出现的问题

    最近遇到了一个关于JSONKit的问题,在项目加了arm7 64位以后,JSONKIT会出现[params JSONString] forKey:@”gson”];报错的情况,如下图 具体原因不太清楚 ...