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_trxinnodb_locksinnodb_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 Locking
  • innodb_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

死锁

死锁指两个或以上的事物在执行过程中,因争夺锁资源而造成的一种互相等待的现象。

解决方法:

  1. 超时回滚,通过对超时的事物进行回滚的操作。
  2. wait-for graph(等待图),主动的检测死锁机制,每个事物在请求锁发生等待时都会判断是否存在回路,若存在则选择回滚undo量最小的事物。采用深度有限算法实现。

《Mysql技术内幕,Innodb存储引擎》——锁的更多相关文章

  1. 使用redis构建可靠分布式锁

    关于分布式锁的概念,具体实现方式,直接参阅下面两个帖子,这里就不多介绍了. 分布式锁的多种实现方式 分布式锁总结 对于分布式锁的几种实现方式的优劣,这里再列举下 1. 数据库实现方式 优点:易理解 缺 ...

  2. 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)

    前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...

  3. java中的锁

    java中有哪些锁 这个问题在我看了一遍<java并发编程>后尽然无法回答,说明自己对于锁的概念了解的不够.于是再次翻看了一下书里的内容,突然有点打开脑门的感觉.看来确实是要学习的最好方式 ...

  4. 分布式锁1 Java常用技术方案

    前言:       由于在平时的工作中,线上服务器是分布式多台部署的,经常会面临解决分布式场景下数据一致性的问题,那么就要利用分布式锁来解决这些问题.所以自己结合实际工作中的一些经验和网上看到的一些资 ...

  5. 如何在高并发环境下设计出无锁的数据库操作(Java版本)

    一个在线2k的游戏,每秒钟并发都吓死人.传统的hibernate直接插库基本上是不可行的.我就一步步推导出一个无锁的数据库操作. 1. 并发中如何无锁. 一个很简单的思路,把并发转化成为单线程.Jav ...

  6. 如何定位Oracle数据库被锁阻塞会话的根源

    首先再次明确下,数据库因为要同时保证数据的并发性和一致性,所以操作有锁等待是正常的. 只有那些长时间没有提交或回滚的事物,阻塞了其他业务正常操作,才是需要去定位处理的. 1.单实例环境 2.RAC环境 ...

  7. java 线程 Lock 锁使用Condition实现线程的等待(await)与通知(signal)

    一.Condition 类 在前面我们学习与synchronized锁配合的线程等待(Object.wait)与线程通知(Object.notify),那么对于JDK1.5 的 java.util.c ...

  8. Android 死锁和重入锁

    死锁的定义: 1.一般的死锁 一般的死锁是指多个线程的执行必须同时拥有多个资源,由于不同的线程需要的资源被不同的线程占用,最终导致僵持的状态,这就是一般死锁的定义. package com.cxt.t ...

  9. Xcode 锁终端

    锁终端 输入: <1>cd /Applications/Xcode.app 回车 结果显示: Xcode.app 输入: <2>sudo chown -hR root:whee ...

  10. mysql 行级锁的使用以及死锁的预防

    一.前言 mysql的InnoDB,支持事务和行级锁,可以使用行锁来处理用户提现等业务.使用mysql锁的时候有时候会出现死锁,要做好死锁的预防. 二.MySQL行级锁 行级锁又分共享锁和排他锁. 共 ...

随机推荐

  1. Javascript 中函数的 length 属性

    每个函数都有一个 length属性 (函数名.length), 表示期望接收的函数的个数(而不是实际接收的参数个数) 它与arguments不同. arguments.length 是表示函数实际接收 ...

  2. Gitlab搭建安装及使用中遇到的问题。

    一.CentOS7安装gitlab-ce 1.下载及安装rpm软件包. 下载RPM包 curl -LJO https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/ ...

  3. 使用 X-Frame-Options 防止被iframe 造成跨域iframe 提交挂掉

     Refused to display 'http://www.***.com/login/doLogin.html' in a frame because it set 'X-Frame-Optio ...

  4. 8086汇编语言(1)虚拟机安装ms-dos 7.1

    8086汇编语言(1)虚拟机安装ms-dos 7.1 文/玄魂 前言 在开始这一系列文章之前,我想先说下,对于古董级的8086汇编到底还以有没有学习的必要.这里我说下我要从8086开始学习,而不是从w ...

  5. oracle 11g Enterprise Manager配置失败

    Enterprise Manager以下简称em,Database Configuration Assistant简称DBCA. 病症 监听程序未启动或数据库服务未注册到该监听程序.启动该监听程序并注 ...

  6. 关于Unity中的NavMeshAgent的remainingDistance问题

    Unity中的NavMeshAgent的remainingDistance问题 在Unity官方案例中,要让某个人物移动到某个地方,一般来说都是下面这样的代码: agent.SetDestinatio ...

  7. php不用递归完成无限分类,从表设计入手完整演示过程

    无限分类是什么就不废话了,可以用递归实现,但是递归从数据库取东西用递归效率偏低,如果从表设计入手,就很容易做到网站导航的实现,下面是某论坛导航,如下图 网上无限分类大多不全面,今天我会从设计表开始, ...

  8. 附1 Java内存模型与共享变量可见性

    注:本文主要参考自<深入理解Java虚拟机(第二版)>和<深入理解Java内存模型> 1.Java内存模型(JMM) Java内存模型的主要目标:定义在虚拟机中将变量存储到内存 ...

  9. Kettle 使用入门

    Kettle是一款国外开源的ETL工具,纯java编写,可以在Window.Linux.Unix上运行,数据抽取高效稳定. 本文介绍一个入门例子:使用Kettle从动态指定的文件名对应的文本文件里抽取 ...

  10. 敏捷项目-依赖项拖动change

    1. 2.类方法插入数据.