主题

最近在看mysql相关的书籍.实验了一些内容.分享一下,主要是关于事务隔离级别(read-committed和repeatable-read)和锁相关的.

很多网上文章上都能搜索到 read-committed可以防止脏数据.但是不能防止 不可重复读.

而repeatable-read可以防止 不可重复读.但是不能防止幻读.

现在我想分享下具体是怎么操作的.

不可重复读下的区别

read-committed和repeatable-read的区别到底是什么?

我觉得在 不可重复读 这个问题上并没有涉及锁的问题.而是涉及一致性非锁定读的问题

假设有一张user,主键id int, name varchar, i varchar.

在i这一列上有索引,非唯一.

数据如下:

id  name  i

1  v1    i1

5  v5    i5

9  v9    i9

所有session的 autocommit=0 不会自动提交.

session A:

update user set name = 'v5-new' where id = 5;  

这个时候锁定了id=5这一列.没有commit

Session B:

select name from user where id = 5

查询出来是v5.这是因为RR和RC都不会读到脏数据

然后session A:

commited;

这个时候行最新的name已经是v5-new了

Session B:

select name from user where id = 5

这个时候的select就有区别了.

RC读出来是v5-new, RR仍然是v5

但是要注意的是Session B在这里始终都只是一般的select,所以没有加锁.所以这里不可重复和锁我觉得没有关系(但是和session A在记录上加的X锁有点关系,因为这条记录被锁定了).

那为什么2种隔离级别会有区别呢? 因为一致性非锁定读的原因

session B第一次读取发现记录ID=5被锁定(有X锁).那读的时候就会从undo日志里找到原始的值.也就是v5.

第二次读的时候RC和RR有区别.RC因为session A已经committed,会读最新的行数据,也就是v5-new

而RR仍然会读取之前读到的那个snap-shot版本,也就是v5.所以会有区别..

幻读

RR模式下加上锁可以解决幻读的问题(还原之前的数据).

实验如下:

Session A:

update user set name = 'v55' where i = 'i5';

没有committed

Session B:

insert into user values(6, 'v6', 'i5');

这个时候如果B可以committed,那就会产生幻读的问题.因为A明明修改了所有i=i5的数据.

但是却没有修改B插入的那条.

但是实际上Session B执行这个insert的时候回等待.

因为A锁住了i = i5的数据.所以B是插入不了的.

那如果B执行的是

insert into user values(6, 'v6', 'i6'); 可以吗?

事实上也会等待.因为A会锁定i=i5的数据和它到上下两条相邻数据的区间.

也就是说 i1-i5, i5, i5-i9的数据都被锁住了.都是不能插入的.

insert into user values(10, 'v10', 'ia');

这条记录就可以插入.因为ia在i9之后(字母大于数字).

mysql对主键会锁单条记录.但是对非唯一的一般的索引,会锁单条记录加上上下范围

mysql 锁 事务隔离级别的更多相关文章

  1. (7)MySQL进阶篇SQL优化(InnoDB锁-事务隔离级别 )

    1.概述 在我们在学习InnoDB锁知识点之前,我觉得有必要让大家了解它的背景知识,因为这样才能让我们更系统地学习好它.InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION ...

  2. MySQL之事务隔离级别--转载

    转自:http://793404905.blog.51cto.com/6179428/1615550 本文通过实例展示MySQL事务的四种隔离级别. 1 概念阐述 1)Read Uncommitted ...

  3. MySQL实战 | 03 - 谁动了我的数据:浅析MySQL的事务隔离级别

    原文链接:这一次,带你搞清楚MySQL的事务隔离级别! 使用过关系型数据库的,应该都事务的概念有所了解,知道事务有 ACID 四个基本属性:原子性(Atomicity).一致性(Consistency ...

  4. 【MySQL】事务隔离级别及ACID

    注:begin或start transaction并不是一个事务的起点,而是在执行它们之后的第一个操作InnoDB表的语句,事务才真正开始.start transaction with consist ...

  5. 一文读懂MySQL的事务隔离级别及MVCC机制

    回顾前文: 一文学会MySQL的explain工具 一文读懂MySQL的索引结构及查询优化 (同时再次强调,这几篇关于MySQL的探究都是基于5.7版本,相关总结与结论不一定适用于其他版本) 就软件开 ...

  6. mysql数据库——事务隔离级别

    四种隔离级别: 一:READ UNCOMMITTED(未提交读) 事务可以读取其他事务未提交的数据,称为脏读 二:READ COMMITTED(提交读) 一个事务开始时,只能"看见" ...

  7. 重新学习MySQL数据库8:MySQL的事务隔离级别实战

    重新学习Mysql数据库8:MySQL的事务隔离级别实战 在Mysql中,事务主要有四种隔离级别,今天我们主要是通过示例来比较下,四种隔离级别实际在应用中,会出现什么样的对应现象. Read unco ...

  8. 【Java面试】请你简单说一下Mysql的事务隔离级别

    一个工作了6年的粉丝,去阿里面试,在第一面的时候被问到"Mysql的事务隔离级别". 他竟然没有回答上来,一直在私信向我诉苦. 我说,你只能怪年轻时候的你,那个时候不够努力导致现在 ...

  9. 理解MySql的锁&事务隔离级别

    这几篇文章是从网上(http://www.hollischuang.com)看到的一系列文章,也是重温了一下数据库的相关知识.下面是对这些文章的一些前后行文逻辑的说明: 我们知道,在DBMS的多个事业 ...

随机推荐

  1. VS 编译太慢了吗?新建解决方案配置关闭一部分项目的编译

    手头的解决方案真大!里面的项目个数达到了 30 个或是 50 个?然而接近一半是单元测试项目和辅助工具.再加上一些不尽如人意的项目优化,编译速度真的是无力吐槽.幸好 Visual Studio 提供了 ...

  2. Python 实现汉诺塔问题(递归)

    有三根柱子一次为A,B,C 现在A柱子上有3个块,按照汉诺塔规则移动到C柱子上去,打印步骤? 我们这样理解:A为原始柱,C为目标柱,B为缓冲柱 1.定义一个函数move(n,a,b,c),n为原始柱上 ...

  3. SEO方案

    前端需要注意哪些SEO 合理的title.description.keywords:搜索对着三项的权重逐个减小,title值强调重点即可,重要关键词出现不要超过2次,而且要靠前,不同页面title要有 ...

  4. pandas 的Series 里经常会出现DatetimeIndex这个类

    DatetimeIndex 的操作还是值得研究一下的. 参考其用法, http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Date ...

  5. phpMyAdmin“缺少 mcrypt 扩展。请检查 PHP 配置。”解决办法

    在ecmall二次开发中因php版本要求低于5.3,而如下更新要求升级PHP,所以以下方式不适合于ecmall商城项目. 解决办法:安装php-mcrypt libmcrypt libmcrypt-d ...

  6. 使用php生成数字、字母组合验证码(一)

    项目中经常会遇到一些登陆验证,支付验证等等一系列安全验证的策略.实现方法多种多样,下面就来讲解下如何用php生成简单的文字+数字组合的验证码: 所用语言php,gd库 原理解释: a>实质上是在 ...

  7. 各大互联网公司2014前端笔试面试题–HTML,CSS篇

    Html篇: 1.你做的页面在哪些流览器测试过?这些浏览器的内核分别是什么? IE: trident内核 Firefox:gecko内核 Safari:webkit内核 Opera:以前是presto ...

  8. jdk1.8新特性之lambda表达式

    lambda表达式其实就是指一个匿名函数,应用最广泛的就是匿名内部类的简化.在jdk1.8之前,我们定义一个匿名内部类可能需要写一大坨代码,现在有了lambda之后,可以写的很简洁了.但不是说lamb ...

  9. mysql binlog_format row and Statement 比较

    两种模式的对比: Statement 优点 历史悠久,技术成熟: 产生的 binlog 文件较小: binlog 中包含了所有数据库修改信息,可以据此来审核数据库的安全等情况: binlog 可以用于 ...

  10. JAVA-Unit02: Oracle字符串操作 、 Oracle数值操作 、 Oracle日期操作 、 空值操作

    Unit02: Oracle字符串操作 . Oracle数值操作 . Oracle日期操作 . 空值操作 DQL数据查询语言 查询语句基本由SELECT子句由FROM子句构成. SELECT子句指定要 ...