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脚本下载链接.所有解题答案都是本人自己写的,广大读者如果在阅读使用中,有任何问题 ...
随机推荐
- Linux下搭建Hadoop集群
本文地址: 1.前言 本文描述的是如何使用3台Hadoop节点搭建一个集群.本文中,使用的是三个Ubuntu虚拟机,并没有使用三台物理机.在使用物理机搭建Hadoop集群的时候,也可以参考本文.首先这 ...
- Swift学习之UI开发初探
Swift是供iOS和OS X应用编程的新编程语言.相信很多开发者都在学习这门新语言.废话不多说,下面我就来学习使用Swift创建一个简单的UI应用程序. AD: 概述 Apple近日发布了Swift ...
- WPF(布局)
WPF编程学习——布局 本文目录 1.布局简介 2.面板(Panel) 3.视图框(Viewbox) 4.滚动视图控件(ScrollViewer) 5.公共布局属性 1.布局简介 应用程序界面 ...
- Swift - 使用UISearchController实现带搜索栏的表格
我原来写过一篇文章“Swift - 带结果列表的搜索条(UISearchDisplayController)的用法”,当时是使用UISearchDisplayController来实现带有搜索功能的列 ...
- google2013校园招聘笔试题(全国)
google2013校园招聘笔试题 1. 单项选择题1.1如果把传输速率定义为单位时间内传送的信息量(以字节计算)多少.关于一下几种典型的数据传输速率:1.使用USB2.0闪存盘,往USB闪存盘上拷贝 ...
- 亚马逊AWS在线系列讲座——基于AWS云平台的高可用应用设计
设计高可用的应用是架构师的一个重要目标,可是基于云计算平台设计高可用应用与基于传统平台的设计有很多不同.云计算在给架构师带来了很多新的设计挑战的时候,也给带来了很多新的设计理念和可用的服务.怎样在设计 ...
- Servlet的学习之Response响应对象(2)
本篇接上一篇<Servlet的学习之Response响应对象(1)>,继续从HttpServletResponse响应对象来介绍其方法和功能. 使用setHeader方法结合HTTP协议的 ...
- 14.8.2 Verifying File Format Compatibility 校验文件格式兼容性:
14.8.2 Verifying File Format Compatibility 校验文件格式兼容性: 14.8.2.1 Compatibility Check When InnoDB Is St ...
- C 函数 strstr 的高效实现
C函数库中有一个函数 strstr(char*, char*),它实现的是在一个原字符串中查找一个子串.假设找到这种一个子串,返回这个子串在原字符串中的起始位置,若没有找到这种一个子串.则 ...
- OWAP Top 10
2013 Top 10 List A1-Injection Injection flaws, such as SQL, OS, and LDAP injection occur when untr ...