--MySQL锁与MVCC

--------------------2014/06/29

myisam表锁比较简单,这里主要讨论一下innodb的锁相关问题。

innodb相比oracle锁机制简单许多,锁的类型有如下几类:

shared (S) lock permits the transaction that holds the lock to read a row.

An exclusive (X) lock permits the transaction that holds the lock to update or delete a row.

An Intention shared (IS): Transaction T intends to set S locks on individual rows in table t.

An Intention exclusive (IX): Transaction T intends to set X locks on those rows.

各种类型的锁兼容性:

  X IX S IS
X Conflict Conflict Conflict Conflict
IX Conflict Compatible Conflict Compatible
S Conflict Conflict Compatible Compatible
IS Conflict Compatible Compatible Compatible

除此以外,innodb还有几种锁:InnoDB Record, Gap, and Next-Key Locks。

  • Record lock: This is a lock on an index record.

  • Gap lock: This is a lock on a gap between index records, or a lock on the gap before the first or after the last index record.

  • Next-key lock: This is a combination of a record lock on the index record and a gap lock on the gap before the index record.

--InnoDB operates in REPEATABLE READ transaction isolation level and with theinnodb_locks_unsafe_for_binlog system variable disabled. In this case, InnoDB uses next-key locks for searches and index scans, which prevents phantom rows.

--注意这里的锁全部为index record,如果没有索引就使用默认创建的innodb索引。

下面主要解释一下在repeatable_read和read_committed两种隔离级别下的锁表现。

--REPEATABLE_READ

在一个A事务内,保证多次读的结果不会受到别的事务影响。如果A事务中没有数据修改,那么A事务中应该所有的读结果都是一致的。

可能会有疑问,MVCC多版本控制难道默认不是这样子的吗,在一个事务中,不能的隔离级别MVCC会有何不同?

--------------事务A-------------

------begin  --->scn:xxx0a1

------insert  --->  scn:xxx0a4

------------------------------------------------>C事务scn:xxx0a7同样insert到表中数据并提交。

------select  --->  scn:xxx0a4

------select  --->  scn:xxx0a4

------select  --->  scn:xxx0a4

------commit --->scn:xxx0a5

正如上面的事务图,在repeatable_read隔离级别下,后面3此select的MVCC scn参考都是参考A事务所修改的scn情况读取,不会管其他事务。

再看下面这个例子

--------------事务B-------------

------begin  --->scn:xxx0b1

------select  --->scn:xxx0b1       --结果集2条数据。

------------------------------------------------C事务scn:xxx0b3 insert一条符合上面select条件的数据。

------update  --->scn:xxx0b5       --update select条件的数据,3条数据被更改。

------select  --->scn:xxx0b5         --如上文提到的select mvcc scn参考自己事务内的scn。

------不提交
------------事务D--------------

------insert                  --insert数据到上面的表中,被柱塞!!!

非常诡异,按照ORACLE的经验,只有被修改的行且没有提交的行才会被锁住,这是行级锁的基本特性,而且innodb也实现了行级锁,居然本锁住,觉得不可思议,那究竟是什么原因呢?

这是由于bin_log的原因,由于innodb的binlog为提交后才会写入的,为了保证binlog的写入是安全的,由参数innodb_locks_unsafe_for_binlog决定。在使用基于语句的binlog模式时,执行insert ... select操作会锁定原表上的所有行。同样如上面的update语句,由于也是更新一个结果集,不管是否有where子句,innodb会锁住扫描过的索引和next-key lock机制锁住目标。

这一点就和db2中锁很类似了,表现为无mvcc特性,通过在过滤建上添加索引(而且innodb选择此索引),让结果集只扫描部分索引可以减少锁的行数。

--READ COMMITTED

在一个事务中,读取已经提交的行,不保证读一致性,在MVCC的机制中表现如下。

--------------事务E---------------

------begin  --->scn:xxx0b1

----------------------------------------------->scn:xxx0b2 事务F insert一行数据并提交。

------select  --->scn:xxx0b2

----------------------------------------------->scn:xxx0b4 事务J update一行数据并提交。

------select  --->scn:xxx0b4

--区别在读,在read committed隔离级别中,MVCC的select的参考scn是参考最近的已提交的所有事务,而不是本事务内的。

--思考,由于在repeatable-read模式下,如果一个事务一直不提交,它的select scn一直不推进,应该会出现由于undo空间的清理,可能读不到对应的版本而报错的情况...

问题:通过mysqldump --single-transcation模式获得一致读,由于备份时间很长,会导致undo表空间暴增吗?

MySQL锁与MVCC的更多相关文章

  1. 温故知新-Mysql锁&事务&MVCC

    文章目录 锁概述 锁分类 MyISAM 表锁 InnoDB 行锁 事务及其ACID属性 InnoDB 的行锁模式 注意 MVCC InnoDB 中的 MVCC 参考 你的鼓励也是我创作的动力 Post ...

  2. 面试官一口气问了MySQL事务、锁和MVCC,我

    面试官:你是怎么理解InnoDB引擎中的事务的? 候选者:在我的理解下,事务可以使「一组操作」要么全部成功,要么全部失败 候选者:事务其目的是为了「保证数据最终的一致性」. 候选者:举个例子,我给你发 ...

  3. mysql锁

    锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所有数 ...

  4. MySQL锁系列3 MDL锁

    http://www.cnblogs.com/xpchild/p/3790139.html   MySQL为了保护数据字典元数据,使用了metadata lock,即MDL锁,保证在并发的情况下,结构 ...

  5. Mysql-innoDB存储引擎(事物,锁,MVCC)

    innoDB的特性: 从图中由上至下红色框中的信息是:基于主键的聚集索引 ,数据缓存,外键支持(逻辑上建立外键),行级别锁,MVCC多版本控制,事务支持.这些也是InnoDB最重要的特性. 事务: 数 ...

  6. MySQL锁解决并发问题详解

    文章分为以下几个要点 问题描述以及解决过程 MySQL锁机制 数据库加锁分析 下面讨论的都是基于MySQL的InnoDB. 0. 问题描述以及解决过程 因为涉及到公司利益问题,所以下面很多代码和数据库 ...

  7. 深入理解 MySQL ——锁、事务与并发控制

    本文首发于vivo互联网技术微信公众号 mp.weixin.qq.com/s/JFSDqI5ya… 作者:张硕 本文对 MySQL 数据库中有关锁.事务及并发控制的知识及其原理做了系统化的介绍和总结, ...

  8. MySQL锁(行锁、表锁、页锁、乐观锁、悲观锁等)

    锁,在现实生活中是为我们想要隐藏于外界所使用的一种工具.在计算机中,是协调多个进程或县城并发访问某一资源的一种机制.在数据库当中,除了传统的计算资源(CPU.RAM.I/O等等)的争用之外,数据也是一 ...

  9. 浅谈数据库并发控制 - 锁和 MVCC

    在学习几年编程之后,你会发现所有的问题都没有简单.快捷的解决方案,很多问题都需要权衡和妥协,而本文介绍的就是数据库在并发性能和可串行化之间做的权衡和妥协 - 并发控制机制. 如果数据库中的所有事务都是 ...

随机推荐

  1. JQuery实战——页面进度条效果

    今早逛阮一峰大神的博客 ECMAScript 6 入门 时候看到页面顶部有个进度条显示当前浏览的进度,如图: 顶部进度条会根据当前页面高度进行宽度调整,实战一番,视觉使用animated方法实现.下面 ...

  2. 浅析ConcurrentHashMap

    一.导论 这些天一直在看关于多线程和高并发的书籍,也对jdk中的并发措施了解了些许,看到concurrentHashMap的时候感觉知识点很乱,有必要写篇博客整理记录一下. 当资源在多线程下共享时会产 ...

  3. Python库:序列化和反序列化模块pickle介绍

    1 前言 在“通过简单示例来理解什么是机器学习”这篇文章里提到了pickle库的使用,本文来做进一步的阐述. 通过简单示例来理解什么是机器学习 pickle是python语言的一个标准模块,安装pyt ...

  4. 使用Homebrew配置Java开发环境

    查询java brew cask search java 查看版本信息 brew cask info java 从官网下载并安装 JDK 8 brew cask install java 需要安装 J ...

  5. 2017寒假零基础学习Python系列之函数之 返回多个值

    Python也和C语言一样有自己的标准库,不过在Python中叫做模块(module),这个和C语言中的头文件以及Java中的包类似,其中math就是其中之一,math模块中提供了sin()和cos( ...

  6. 简单地总结几种常见web攻击手段及其防御方式

    web攻击手段有几种,本文简单介绍几种常见的攻击手段及其防御方式 XSS(跨站脚本攻击) CSRF(跨站请求伪造) SQL注入 DDOS XSS 概念 全称是跨站脚本攻击(Cross Site Scr ...

  7. CharacterEncodingFilter -处理字符格式

    package com.pb.news.web.filter; import java.io.IOException;import javax.servlet.Filter;import javax. ...

  8. Python之编写登陆接口

    1.输入用户名密码: 2.认证成功后显示欢迎信息: 3.错误三次后,账号被锁定. 账号文件:user.txt 锁定文件:locked.txt 流程图如下: # -*- coding:utf-8 -*- ...

  9. 前端页面——Cookie与Session有什么区别

    我们在实际生活中总会遇到这样的事情,我们一旦登录(首次输入用户名和密码)某个网站之后,当我们再次访问的时候(只要不关闭浏览器),无需再次登录.而当我们在这个网站浏览一段时间后,它会产生我们浏览的记录, ...

  10. for循环问题

    印象中的for语句是这样的,语法:  for (语句 1; 语句 2; 语句 3) { 被执行的代码块 }  语句 1 (代码块)开始前执行 starts. 语句 2 定义运行循环(代码块)的条件 语 ...