Innodb中的锁
Innodb中的锁
共享锁和排它锁(Shared and Exclusive Locks)
共享锁和排它锁是行级锁,有两种类型的行级锁
共享锁(s lock)允许持有锁的事务对行进行读取操作
排它锁(x lock)允许持有锁的事务对行进行更新和删除操作
事务a在行r上拥有共享锁,则其他事务可以获得r的共享锁,无法获得r的排它锁,即可读不可写
事务a在行r上拥有排它锁,则其他事务既不能获得共享锁,也不能获得排它锁,即不可读也不可写而必须等待当前事务完成
意向锁(Intention Locks)
意向锁是表级锁,用来表示将会有哪种类型的行级锁即将被使用,有两种类型的意向锁
意向共享锁(IS Locks):表明即将在表中的某一行上设置共享锁(s lock)
意向排它锁(Ix Locks): 表明即将在表中的某一行上设置排它锁(x lock)
一个事务如果要获得一个共享锁(s lock)必须首先获得一个意向共享锁(is lock),一个事务如果要获得一个排它锁(x lock)则必须先获得一个意向排它锁(ix lock)
各种锁级别的兼容性
X |
IX |
S |
IS |
|
---|---|---|---|---|
X |
Conflict | Conflict | Conflict | Conflict |
IX |
Conflict | Compatible | Conflict | Compatible |
S |
Conflict | Conflict | Compatible | Compatible |
IS |
Conflict | Compatible | Compatible | Compatible |
行级锁(Record Locks)
行级锁总是锁住索引记录(index records),即便表没有定义索引,innodb也会创建一个隐藏的聚簇索引,然后用这个索引来锁住这一行。
间隙锁(Gap Locks)
间隙锁是用于索引之间或第一个索引之前或最后一个索引之后的锁, 当语句中有一个确定的索引值的时候,间隙锁会降级为行级锁。例如这个
select * from child where id =100;
Next-Key Locks
不知道怎么翻译了。这是行级锁和间隙锁的组合,也就是说这种类型的锁会做作用于一条记录上和它之前的间隙,不允许插入。
自增锁(AUTO-INC Locks)
一个特殊的表级锁,用于带有auto-increment选项的列上,它会让你获得连续的主键值。这个锁的释放在它的sql语句执行完成之时,而非事务结束之时,这样其他的事务可以不必等到事务结束才获得自增锁。innodb_autoinc_lock_mode是用来配置这个锁的。
Predicate Locks
谓词锁(不知道是不是这个意思),作用于空间索引(spatial indexes)。
常见sql语句的锁级别
innodb默认的隔离级别是可重复读(repeatable read),默认的读取方式是一致性读(consistent read),所谓一致性读就是在你开启事务的时候,innodb会保存一个时间戳,在此之后的改变都是不可见的。由于innodb是一个多版本存储引擎(multi-versioned storage engine),它会保存改变的行之前的旧的数据以支持一些事务特性,例如并发和回滚。这些数据被存储在表空间(tablespace)的一个叫rollback segment的数据结构里。这里的数据会被用来重建之前的值来保证一致性读(consistent read)。
select ... from : 一致性读,不需要锁,除非隔离级别被设为串行化(serializable)。
select ... from ... lock in share mode :在搜索条件里的每条记录设置共享的next-key lock, 如果有特定的索引值则为行级锁。
select ... from ... for update :在搜索条件里的每条记录设置排它的next-key lock, 如果有特定的索引值则为行级锁。
update ... where... 在搜索条件里的每条记录设置排它的next-key lock, 如果有特定的索引值则为行级锁。
delete from ... where ... : 在搜索条件里的每条记录设置排它的next-key lock, 如果有特定的索引值则为行级锁。
insert 语句设置一个排它锁在插入的行上,为行级锁。当有多个会话尝试插入相同主键发生主键冲突时,可能会发生死锁,因为在发生主键冲突时他们各自获得了共享锁,而都不能获得排它锁。
insert ... on duplicate key update : 和之前的insert语句不同的是当发生主键冲突时,他们会获得排它锁而非共享锁,这样就避免了多个会话获得共享锁而发生死锁。
手动加锁
select ... from ... lock in share mode
select ... from ... for update
lock tables tb_name [AS alias {read [local] | [low_priority] write }
[,tb_name [AS alias {read [local] | [low_priority] write }...]
unlock tables;
read local允许在锁定被保持时,执行非冲突性insert语句
low_priority write锁定来允许其它线程在该线程正在等待write锁时获得read锁
Innodb中的锁的更多相关文章
- InnoDB的锁机制浅析(二)—探索InnoDB中的锁(Record锁/Gap锁/Next-key锁/插入意向锁)
Record锁/Gap锁/Next-key锁/插入意向锁 文章总共分为五个部分: InnoDB的锁机制浅析(一)-基本概念/兼容矩阵 InnoDB的锁机制浅析(二)-探索InnoDB中的锁(Recor ...
- InnoDB 中的锁实现
InnoDB 中的锁实现 原贴:InnoDB 锁系统及死锁检测实现分析 InnoDB 中,所有事务加的行锁通过一个全局的 hash 表 lock_sys 维护: /* The lock system ...
- MySql InnoDB中的锁研究
# MySql InnoDB中的锁研究 ## 1.InnoDB中有哪些锁### 1. 共享和排他(独占)锁(Shared and Exclusive Locks) InnoDB实现标准的行级锁定,其中 ...
- MySQL/InnoDB中,对于锁的认识
MySQL/InnoDB的加锁,一直是一个面试中常问的话题.例如,数据库如果有高并发请求,如何保证数据完整性?产生死锁问题如何排查并解决?我在工作过程中,也会经常用到,乐观锁,排它锁,等.于是今天就对 ...
- Innodb中怎么查看锁信息
一.前言 上一篇说了下innodb中锁的大概意思, 这篇说说怎么查看加的哪些锁.不然后续出现死锁或者锁等待都不知道为什么. 二.底层基础表信息 在学会如何查看有哪些锁信息时, 需要了解一些基础表信息, ...
- 重新学习MySQL数据库7:详解MyIsam与InnoDB引擎的锁实现
重新学习Mysql数据库7:详解MyIsam与InnoDB引擎的锁实现 说到锁机制之前,先来看看Mysql的存储引擎,毕竟不同的引擎的锁机制也随着不同. 三类常见引擎: MyIsam :不支持事务,不 ...
- Innodb中的事务隔离级别和锁的关系
前言: 我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式.同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果加锁过度,会极大的降低并发处理能力. ...
- Innodb中的事务隔离级别和锁的关系(转)
原文:http://tech.meituan.com/innodb-lock.html 前言: 我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式.同时数据库 ...
- MySQL数据库InnoDB存储引擎中的锁机制
MySQL数据库InnoDB存储引擎中的锁机制 http://www.uml.org.cn/sjjm/201205302.asp 00 – 基本概念 当并发事务同时访问一个资源的时候,有可能 ...
随机推荐
- 25.Linux-Nor Flash驱动(详解)
1.nor硬件介绍: 从原理图中我们能看到NOR FLASH有地址线,有数据线,它和我们的SDRAM接口相似,能直接读取数据,但是不能像SDRAM直接写入数据,需要有命令才行 1.1其中我们2440的 ...
- Java基础-运行原理及变量(01)
java运行原理 手动编写java文件由编译器编译成.class文件,再由解释器翻译class文件成机器语言运行. Java中注释分类 单行注释格式: //注释文字多行注释格式: /* 注释文字 */ ...
- 关于 Swift 4 中内存安全访问
前言 本文主要翻译今年 The Swift Programming Language (Swift 4) 中新出的章节 -<Memory Safety>.在 Swift 4 中,内存安全访 ...
- PHP开发框架之YII框架学习——碾压ThinkPHP不是梦
前 言 JRedu 程序猿是一种慵懒的生物!能少敲一行代码,绝对不会多敲一个字符!所以,越来越多的开发框架应运而生,在帮助我们完成功能的同时,极大程度上也帮我们节省了人力物力,而且也提高了系统的 ...
- 数据分析与展示——NumPy库入门
这是我学习北京理工大学嵩天老师的<Python数据分析与展示>课程的笔记.嵩老师的课程重点突出.层次分明,在这里特别感谢嵩老师的精彩讲解. NumPy库入门 数据的维度 维度是一组数据的组 ...
- MySQL数据库储存bit类型的值报错
当我们储存bit类型的值时,不能直接写入数字 上图中的画圈部分就是bit类型,若是直接填入"1"或"0"等等就会报错,如下: 这时候,我们要看bit(M)的M值 ...
- 前端安全之CSRF攻击
前端安全之CSRF攻击 转载请注明出处:unclekeith: 前端安全之CSRF攻击 CSRF定义 CSRF,即(Cross-site request forgery), 中文名为跨站请求伪造.是一 ...
- JavaScript Function.call() 函数详解
语法 functionObject.call( [ thisObj [, arg1 [, arg2 [, args...]]]] ) call()函数用于调用当前函数functionObject,并可 ...
- 利用canvas 导出图片
1.使用canvas绘制图片,并将图片导出. 在本地直接访问静态网页时,无法使用toDataURL(),需要将网页发布后,canvas才能使用toDataURL获取画布上的内容.因为canvas不允许 ...
- TOMCAT启动到一半停止如何解决
当你的项目过大的时候,往往会导致你的TOMCAT启动时间过长,启动失败,遇到该情况可以试一下下面两招: TOmcat启动到一半的时候停止了,以下原因: 1. tomcat启动时间超过了设置时间: 解 ...