mysql 锁 事务隔离级别
主题
最近在看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 锁 事务隔离级别的更多相关文章
- (7)MySQL进阶篇SQL优化(InnoDB锁-事务隔离级别 )
1.概述 在我们在学习InnoDB锁知识点之前,我觉得有必要让大家了解它的背景知识,因为这样才能让我们更系统地学习好它.InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION ...
- MySQL之事务隔离级别--转载
转自:http://793404905.blog.51cto.com/6179428/1615550 本文通过实例展示MySQL事务的四种隔离级别. 1 概念阐述 1)Read Uncommitted ...
- MySQL实战 | 03 - 谁动了我的数据:浅析MySQL的事务隔离级别
原文链接:这一次,带你搞清楚MySQL的事务隔离级别! 使用过关系型数据库的,应该都事务的概念有所了解,知道事务有 ACID 四个基本属性:原子性(Atomicity).一致性(Consistency ...
- 【MySQL】事务隔离级别及ACID
注:begin或start transaction并不是一个事务的起点,而是在执行它们之后的第一个操作InnoDB表的语句,事务才真正开始.start transaction with consist ...
- 一文读懂MySQL的事务隔离级别及MVCC机制
回顾前文: 一文学会MySQL的explain工具 一文读懂MySQL的索引结构及查询优化 (同时再次强调,这几篇关于MySQL的探究都是基于5.7版本,相关总结与结论不一定适用于其他版本) 就软件开 ...
- mysql数据库——事务隔离级别
四种隔离级别: 一:READ UNCOMMITTED(未提交读) 事务可以读取其他事务未提交的数据,称为脏读 二:READ COMMITTED(提交读) 一个事务开始时,只能"看见" ...
- 重新学习MySQL数据库8:MySQL的事务隔离级别实战
重新学习Mysql数据库8:MySQL的事务隔离级别实战 在Mysql中,事务主要有四种隔离级别,今天我们主要是通过示例来比较下,四种隔离级别实际在应用中,会出现什么样的对应现象. Read unco ...
- 【Java面试】请你简单说一下Mysql的事务隔离级别
一个工作了6年的粉丝,去阿里面试,在第一面的时候被问到"Mysql的事务隔离级别". 他竟然没有回答上来,一直在私信向我诉苦. 我说,你只能怪年轻时候的你,那个时候不够努力导致现在 ...
- 理解MySql的锁&事务隔离级别
这几篇文章是从网上(http://www.hollischuang.com)看到的一系列文章,也是重温了一下数据库的相关知识.下面是对这些文章的一些前后行文逻辑的说明: 我们知道,在DBMS的多个事业 ...
随机推荐
- bzoj 4595 激光发生器
bzoj 4595 激光发生器 光线为射线,每次找到与当前光线相交且距离最近的镜子,然后旋转光线. 直线,射线利用线上一点+方向向量的方式表示.旋转时,旋转中心作为线上一点不变,方向向量左乘旋转矩阵. ...
- BZOJ1015: [JSOI2008]星球大战starwar【并查集】【傻逼题】
Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过 ...
- 基于 task 为 VSCode 添加自定义的外部命令
我们有很多全局的工具能在各处使用命令行调用,针对某个仓库特定的命令可以放到仓库中.不过,如果能够直接为顺手的文本编辑器添加自定义的外部命令,那么执行命令只需要简单的快捷键即可,不需要再手工敲了. ...
- PageViewController和UIPageControl
以前经常把这两个东西当成一回事, PageViewController像电子书那样,一页之中可以放几个childViewcontroller, 然后左右翻,当前frame显示几个viewcontro ...
- Hadoop 2.2 & HBase 0.96 Maven 依赖总结
由于Hbase 0.94对Hadoop 2.x的支持不是非常好,故直接添加Hbase 0.94的jar依赖可能会导致问题. 但是直接添加Hbase0.96的依赖,由于官方并没有发布Hbase 0.96 ...
- python(八):反射
反射机制是通过python3内置的hasattr.getattr.setattr来实现的.即根据变量名的字符串形式来获取变量名的属性或方法. 一.通过反射查看已知对象的属性和方法 getattr(ob ...
- Java8新特性——StreamAPI(一)
1. 流的基本概念 1.1 什么是流? 流是Java8引入的全新概念,它用来处理集合中的数据,暂且可以把它理解为一种高级集合. 众所周知,集合操作非常麻烦,若要对集合进行筛选.投影,需要写大量的代码, ...
- drill java && spring jdbc 连接使用
原生 jdbc 连接 1. maven 包 <dependency> <groupId>org.apache.drill.exec</groupId> < ...
- 用js实现屏蔽F12、鼠标右击、鼠标左击
function window.onhelp(){return false} //屏蔽F1帮助 document.onkeydown = function(){ if(window.event &am ...
- SAE部署Django1.6+MySQL
[解决]SAE部署Django1.6+MySQL 终于可以舒口气了,今天大部分时间都在搞这个,很是蛋疼,网上资料良莠不齐,我不信这个之前没人做过,但是他们确实分享的不够好. 废话不多说,还是记录一下今 ...