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. 推荐:普通UI设计师与顶级UI设计师的区别是什么?(转)

    我不是顶级设计师(我甚至不知道什么才叫顶级),即使见过的一些顶级(知名or优秀)设计师也因为交流不深入,无法评价.但是我勉强可以回答优秀的设计师,和普通的设计师(其实我觉得大部分的普通设计师只是认识他 ...

  2. (最小生成树)QS Network -- ZOJ --1586

    链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1586 http://acm.hust.edu.cn/vjudge/ ...

  3. Codeforces735B Urbanization 2016-12-13 11:58 114人阅读 评论(0) 收藏

    B. Urbanization time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  4. Gridview的RowDataBound事件可以做很多事情

    protected void gvTest_RowDataBound(object sender, GridViewRowEventArgs e)        {            //如果是绑 ...

  5. hdu 2058 The sum problem(数学题)

    一个数学问题:copy了别人的博客 #include<cstdio> #include<cstdlib> #include<cmath> int main() { ...

  6. javascript 问题

    两个数组比较:a.sort().toString() == b.sort().toString() for循环内有异步方法时,需要闭包 JSON.parse(data)出错时(提示.[nodejs中] ...

  7. Using Integrated SOA Gateway in Oracle EBS(websevice)

    http://blog.csdn.net/pan_tian/article/details/10159935 Oracle EBS如何与第三方系统相集成?比如这样的需求,X系统知道物料编码,需要从EB ...

  8. cxgrid动态显示行号

    uses cxLookAndFeelPainters; type TMyCxGrid = class(TObject)    class procedure DrawIndicatorCell(    ...

  9. pgAdmin4 汉化

  10. 微信退款证书使用c#

    微信退款需要证书 data为已封装好的xml数据 具体怎么封装>打开 public string get(string data) { string cert = @"D:\certi ...