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. Ubuntu16.04安装PostgreSQL并使用pgadmin3管理数据库_图文详解

    版权声明:本文地址http://blog.csdn.net/caib1109/article/details/51582663 欢迎非商业目的的转载, 作者保留一切权利 apt安装postgresql ...

  2. Robotframework 简介及工作原理

    下面通过官网和网上资料来简单介绍下Robotframework及其工作原理. 官方说明: Robot Framework is a generic test automation framework ...

  3. 深浅 buffer

    var str = "深入浅出"; var buf = new Buffer(str, 'utf-8'); console.log(buf); 这种情况下是数字 var str = ...

  4. Spring MVC 的@RequestParam注解和request.getParameter("XXX")

    在SpringMVC后台控制层获取参数的方式主要有两种,一种是request.getParameter("name"),另外一种是用注解@RequestParam直接获取.这里主要 ...

  5. 利用Kettle进行SQLServer与Oracle之间的数据迁移实践

    Kettle简介 Kettle(网地址为http://kettle.pentaho.org/)是一款国外开源的ETL工具,纯java编写,可以在Windows.Linux.Unix上运行,数据抽取高效 ...

  6. ASP.NET MVC学习之模型验证详解

    ASP.NET MVC学习之模型验证篇 2014-05-28 11:36 by y-z-f, 6722 阅读, 13 评论, 收藏, 编辑 一.学习前的一句话 在这里要先感谢那些能够点开我随笔的博友们 ...

  7. ASP.NET MVC 全局异常

    先新建一个过滤器ExceptionHandleErrorAttribute.cs 内容如下: using System; using System.Net; using System.Web; usi ...

  8. ASP.NET Core使用EPPlus操作Excel

    1.前言 本篇文章通过ASP.NET Core的EPPlus包去操作Excel(导入导出),其使用原理与NPOI类似,导出Excel的时候不需要电脑上安装office,非常好用 2.使用 新建一个AS ...

  9. 《ASP.NET MVC 5 破境之道》:第一境 ASP.Net MVC5项目初探 — 第一节:运行第一个MVC5项目

    第一境 ASP.Net MVC5项目初探 — 第一节:运行第一个MVC5项目 创建一个MVC项目,是很容易的,大部分工作,VS都帮我们完成了.只需要按照如下步骤按部就班就可以了. 打开VS2017,选 ...

  10. 记一次生产发版时SpringBoot服务停用启用的问题

    近期项目交接,接手了个SpringBoot项目.生产环境里,jar包是通过软链接做成linux服务来启动和停用. 然而,每次通过jenkins构建发版,项目构建完毕,还要手动再去重启服务. 听交接的同 ...