《Mysql技术内幕,Innodb存储引擎》——锁
lock与latch
在数据库中lock与latch分别指不同的所。
- latch:可分为互斥量(mutex)和读写锁(rwlock),目的在于保证数据库内部的结构中共享资源并发时能够正确操作,其对象主要是内存中的各种数据库的数据结构如LRU等。
- lock:用来锁定数据库中的对象,如表、页、行。一般lock的对象在事物的begin transaction开始上锁,到commit或rollback释放锁。lock还会提供死锁机制,而latch则是正常的代码上的锁。
Innodb中锁
Innodb实现了两种标准的行级锁。
- 共享锁(S Lock):允许事物读一行数据(读锁).
- 排他锁(X Lock):允许事物删除或更新一行数据(写锁).
共享锁可以看成是读锁,排他锁可以当作写锁。因此S锁与S锁可兼容,X锁不可兼容。
为了能在不同粒度上进行加锁,Innodb支持意向锁(Intention Lock),其将锁定的对象分为多个层次(表、页和记录),其表示事物希望在更细的粒度上进行加锁。
innodb支持表级别的意向锁
- 意向共享锁(IS Lock):事物想要获得一张表中某几行的共享锁。
- 意向排它锁(IX Lock):事物想要获得一张表中某几行的排他锁。
行级锁与表级锁的兼容性
| IS | IX | S | X | |
|---|---|---|---|---|
| IS | 兼容 | 兼容 | 兼容 | 不兼容 |
| IX | 兼容 | 兼容 | 不兼容 | 不兼容 |
| S | 兼容 | 不兼容 | 兼容 | 不兼容 |
| X | 不兼容 | 不兼容 | 兼容 | 不兼容 |
show engine innodb status可查看数据库当前锁请求information_schema下的innodb_trx、innodb_locks和innodb_lock_waits三张表记录当前数据库的锁和事物相关信息。
一致性非锁定读
- 原理:MVCC通过行多版本控制的方式读取数据,从而实现读取数据不需要上锁(即使被上了X锁),可以直接读取数据快照。
- 实现方式:快照数据是指该行的之前的数据版本,通过undo段实现。
- innodb默认是非锁定读,RC和RR两种级别均采用该方式,但是不同的隔离级别读取的数据快照版本也不一样。
- RC下读取总是被锁定行的最新一份快照数据(可能出现不可重复读的问题)
- RR下读取的总是事物开始时的行数据版本.
一致性锁定读
显示对数据库读取操作进行加锁以保证数据逻辑的一致性。
select ... for update //加X锁
select ... lock in share mode //加S锁
自增长实现
- 每个含有自增长值的表都有一个自增长计数器(auto-increment counter),当要使用时执行
select max(col) from t for update; - 这种实现方式的锁为AUTO-INC Locking,一种特殊的锁机制,其在完成自增值插入的SQL后将立即释放锁。然而对于insert的并发会造成阻塞。
- innodb新的解决方案,
innodb_autoinc_lock_mode控制自增长模式。 innodb_autoinc_lock_mode = 0使用AUTO-INC Lockinginnodb_autoinc_lock_mode = 1(默认模式)对于插入之前就能确定插入行数的使用互斥量去对内存中的计数器进行累加操作,而不能确定行数的(insert...select 或load data)则还是采用AUTO-INC Locking.innodb_autoinc_lock_mode = 2都使用互斥量对内存计数器做累加。
外键与锁
- innodb对于外键将自动创建一个索引。
- 对与外键的插入或更新将先用锁定读方式读取父表,给父表加了一把S锁。为了防止父表中的数据修改导致外键约束错误。
锁算法
InnoDB的三种行级锁
- Record Lock:单个行记录上的锁
- Gap Lock:间隙锁,锁定一个范围,不包括记录本身。作用在于阻止多个事物将记录插入到同一范围内。
- Next-Key Lock:Gap+Record Lock,锁定一个范围和记录本身。对行的查询都是采用该锁。当该锁作用与唯一索引上时将降级为Record Lock
死锁
死锁指两个或以上的事物在执行过程中,因争夺锁资源而造成的一种互相等待的现象。
解决方法:
- 超时回滚,通过对超时的事物进行回滚的操作。
- wait-for graph(等待图),主动的检测死锁机制,每个事物在请求锁发生等待时都会判断是否存在回路,若存在则选择回滚undo量最小的事物。采用深度有限算法实现。
《Mysql技术内幕,Innodb存储引擎》——锁的更多相关文章
- 使用redis构建可靠分布式锁
关于分布式锁的概念,具体实现方式,直接参阅下面两个帖子,这里就不多介绍了. 分布式锁的多种实现方式 分布式锁总结 对于分布式锁的几种实现方式的优劣,这里再列举下 1. 数据库实现方式 优点:易理解 缺 ...
- 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)
前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...
- java中的锁
java中有哪些锁 这个问题在我看了一遍<java并发编程>后尽然无法回答,说明自己对于锁的概念了解的不够.于是再次翻看了一下书里的内容,突然有点打开脑门的感觉.看来确实是要学习的最好方式 ...
- 分布式锁1 Java常用技术方案
前言: 由于在平时的工作中,线上服务器是分布式多台部署的,经常会面临解决分布式场景下数据一致性的问题,那么就要利用分布式锁来解决这些问题.所以自己结合实际工作中的一些经验和网上看到的一些资 ...
- 如何在高并发环境下设计出无锁的数据库操作(Java版本)
一个在线2k的游戏,每秒钟并发都吓死人.传统的hibernate直接插库基本上是不可行的.我就一步步推导出一个无锁的数据库操作. 1. 并发中如何无锁. 一个很简单的思路,把并发转化成为单线程.Jav ...
- 如何定位Oracle数据库被锁阻塞会话的根源
首先再次明确下,数据库因为要同时保证数据的并发性和一致性,所以操作有锁等待是正常的. 只有那些长时间没有提交或回滚的事物,阻塞了其他业务正常操作,才是需要去定位处理的. 1.单实例环境 2.RAC环境 ...
- java 线程 Lock 锁使用Condition实现线程的等待(await)与通知(signal)
一.Condition 类 在前面我们学习与synchronized锁配合的线程等待(Object.wait)与线程通知(Object.notify),那么对于JDK1.5 的 java.util.c ...
- Android 死锁和重入锁
死锁的定义: 1.一般的死锁 一般的死锁是指多个线程的执行必须同时拥有多个资源,由于不同的线程需要的资源被不同的线程占用,最终导致僵持的状态,这就是一般死锁的定义. package com.cxt.t ...
- Xcode 锁终端
锁终端 输入: <1>cd /Applications/Xcode.app 回车 结果显示: Xcode.app 输入: <2>sudo chown -hR root:whee ...
- mysql 行级锁的使用以及死锁的预防
一.前言 mysql的InnoDB,支持事务和行级锁,可以使用行锁来处理用户提现等业务.使用mysql锁的时候有时候会出现死锁,要做好死锁的预防. 二.MySQL行级锁 行级锁又分共享锁和排他锁. 共 ...
随机推荐
- DUBBO配置规则详解
研究DUBBO也已经大半年了,对它的大部分源码进行了分析,以及对它的内部机制有了比较深入的了解,以及各个模块的实现.DUBBO包含很多内容,如果想了解DUBBO第一步就是启动它,从而可以很好的使用它, ...
- 大猪蹄子队 Scrum meeting 合集
大猪蹄子队 Scrum meeting 合集 18-10-29 第一天 http://note.youdao.com/noteshare?id=79ce5a89f85995ef68deae14e538 ...
- 运行spark官方的graphx 示例 ComprehensiveExample.scala报错解决
运行spark官方的graphx 示例 ComprehensiveExample.scala报错解决 在Idea中,直接运行ComprehensiveExample.scala,报需要指定master ...
- Dalsa线扫相机配置-一台工控机同时连接多个GigE相机
如图,我强悍的工控机,有六个网口. 实际用的时候连了多台相机,为了偷懒我就把六个网口的地址分别设为192.168.0.1~192.168.0.6,以为相机的IP只要设在192.168.0这个网段然后随 ...
- MS SQL 分页存储过程
最近换了家新公司,但是新公司没有使用分页的存储过程.那我就自个写一个往项目上套 (效率怎么样就不怎么清楚没有详细的测试过) CREATE PROCEDURE [dbo].[pro_common_pag ...
- RDLC报表学习
RDLC报表由以下三部分构成: 1.制作自己的DateSet集合(就是报表的数据集): 2.制作自己的报表文件.rdlc文件,用于画做报表样式,里面有微软自带的导出和打印功能,其实就为了少做这2个功能 ...
- XPath高级用法(冰山一角)
运算符+内置函数 使用XPath选择元素时,使用运算符+内置函数来进行筛选: .//div[contains(@class,"ec_desc") or contains(@clas ...
- 如何将Spring Boot项目打包部署到外部Tomcat
1.项目打包 项目开发结束后,需要打包部署到外部服务器的Tomcat上,主要有几种方式. (1)生成jar包 cd 项目跟目录(和pom.xml同级)mvn clean package## 或 ...
- 《Python黑帽子:黑客与渗透测试编程之道》 基于GitHub的命令和控制
GitHub账号设置: 这部分按书上来敲命令即可,当然首先要注册一个GitHub账号还有之前安装的GitHub API库(pip install github3.py),这里就只列一下命令吧: mkd ...
- 《Python黑帽子:黑客与渗透测试编程之道》 网络:原始套接字和流量嗅探
Windows和Linux上的包嗅探: #!/usr/bin/python import socket import os #监听的主机 host = "10.10.10.160" ...