mysql innodb锁简析(2)
继续昨天的innodb锁的分析:
注:此博文参考一下地址,那里讲的也很详细。http://xm-king.iteye.com/blog/770721
mysql事务的隔离级别分为四种,隔离级别越高,数据安全性越高但是效率越低。
1. Read umcommitted(读未提交):
在该隔离级别内,可以看到其他事务未提交的最新数据。此隔离级别一般并未使用,因为该隔离级别安全要求太低,但效率并未有很大的提高。
容易出现的问题是脏读,具体场景如下:
| tx1 | tx2 | |
| step1 | select name from table1 where id=1(res:0) | |
| step2 | update table1 set name=‘1’ where id=1 | |
| 3 | select name from table1 where id=1(res:1) | |
| 4 | rollback; |
说明:在事务一内读到了事务2为提交的数据,但是事务2在提交的时候出现问题,事务回滚;此时事务一仍以事务2未提交成功的数据做处理,就会出现问题,这就是脏读。
2. Read committed(读已提交)
在该隔离级别内,事务看不到其他事务已经提交的数据,只能看到其他事务已提交的数据。此隔离级别是数据库的默认隔离级别。
容易出现的问题是不可重复读,具体场景如下
|
tx1 |
tx2 |
|
|
step1 |
select name from table1 where id=1(res:0) |
|
|
step2 |
update table1 set name=‘1’ where id=1 |
|
|
3 |
commit |
|
|
4 |
select name from table1 where id=1(res:1) |
说明:在事物一的两次查询过程中,由于事务二更新了数据,导致事物一两次查询到的数据不一致。
3. Repeatable Read(可重复读)
此隔离级别可以有效的解决不可重复读的问题,但是会出现以下的问题,幻读,示例如下:
|
tx1 |
tx2 |
|
|
step1 |
select id from table1 where id<4(res:1,2) |
|
|
step2 |
insert into table1 (name,id) values (‘name1’,3) |
|
|
3 |
commit |
|
|
4 |
select id from table1 where id<4(res:1,2,3) |
在读一定范围内的数据的时候,新插入一条数据,导致两次查到的数据不一致,感觉像是幻影一样,解决方案(粘贴别处的):InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题
4:Serializable(可序列化)
这个是最高的隔离级别,慎用,强行将事务进行排序,使之不会相互冲突,从而解决幻读问题。也就是说,此隔离级别会在查询上强制加一个读锁,在这个级别,可能导致大量的超时现象和锁竞争。
总结(很重要):之前我一直搞不明白读已提交和可重复读两个级别所出现的不可重复度和幻读有什么不同,在冥思苦想和询问同事后终于搞明白了,读已提交级别出现的不可重复读问题,主要指在事务二有update的时候,可重复度解决了以上问题,但是会出现在insert的时候出现幻读。也就是说,不可重复读是update时出现的问题,幻读是insert时出现的问题
mysql innodb锁简析(2)的更多相关文章
- mysql innodb锁简析(1)
说好的每天一个技术博客,选了iteye,但是,那个界面真的好丑啊,丑的让我都没写下去的欲望了,所以,还是转移到博客园里面吧,虽然这里也是很丑的! 直接步入正题: 1. 数据库锁包括:读锁(可共享锁)和 ...
- mysql: 关于MySQL InnoDB锁行还是锁表?
baidu zone - 关于MYSQL Innodb 锁行还是锁表,深入讲解
- [转]关于MYSQL Innodb 锁行还是锁表
关于mysql的锁行还是锁表,这个问题,今天算是有了一点头绪,mysql 中 innodb是锁行的,但是项目中居然出现了死锁,锁表的情况.为什么呢?先看一下这篇文章. 目时由于业务逻辑的需要,必须对数 ...
- MySQL InnoDB锁机制
概述: 锁机制在程序中是最常用的机制之一,当一个程序需要多线程并行访问同一资源时,为了避免一致性问题,通常采用锁机制来处理.在数据库的操作中也有相同的问题,当两个线程同时对一条数据进行操作,为了保证数 ...
- mysql InnoDB锁等待的查看及分析
说明:前面已经了解了InnoDB关于在出现锁等待的时候,会根据参数innodb_lock_wait_timeout的配置,判断是否需要进行timeout的操作,本文档介绍在出现锁等待时候的查看及分析处 ...
- RDS MySQL InnoDB 锁等待和锁等待超时的处理
https://help.aliyun.com/knowledge_detail/41705.html 1. Innodb 引擎表行锁等待和等待超时发生的场景 2.Innodb 引擎行锁等待情况的处理 ...
- MySQL InnoDB锁机制之Gap Lock、Next-Key Lock、Record Lock解析
MySQL InnoDB支持三种行锁定方式: l 行锁(Record Lock):锁直接加在索引记录上面,锁住的是key. l 间隙锁(Gap Lock):锁定索引记录间隙,确保索引记录的间隙 ...
- 你需要知道的MySQL&InnoDB锁都在这里
目录 一.前言 二.锁的类型 2.1 全局锁 2.2 表级锁 2.2.1 表锁 2.2.2 元数据锁(Meta Data Locks) 2.2.3 自增列锁(AUTO-INC Locks) 2.2.4 ...
- mysql——InnoDB 锁
https://www.cnblogs.com/leedaily/p/8378779.html 1.InnoDB锁的实现方式:给索引项加锁,只有通过索引条件检索数据,InnoDB才使用行级锁,否则,I ...
随机推荐
- gitHub入门指导
Github可以托管各种git库,并提供一个web界面,但与其它像 SourceForge或Google Code这样的服务不同,GitHub的独特卖点在于从另外一个项目进行分支的简易性.为一个项目贡 ...
- JMeter使用指南--转
JMeter使用指南 本文重点介绍JMeter工具在测试中地位以及其中一些难以理解或者手册中含糊不清的感念,读者可以通过本文了解这些概念,然后再根据自己的需要查阅JMeter中各个组件的具体用法来完成 ...
- 如何用虚拟机装SQL Server
更新(2016.3.14) 看来之前还是写的太简了,来问的同学有点多. 所以还是详细一些吧. 大概步骤 装好Virtual Box这个软件,免费的 下载window server 2003系统镜像,然 ...
- 使用StarUML画类图
1.综述(What) StarUML是一种生成类图和其他类型的UML图表的工具. StarUML(简称SU),是一种创建UML类图,并能够自动生成Java的“stub code” 的工具.SU也可以做 ...
- eclipse调试jsp中的scriptlet代码
在eclipse开发环境下,jsp中的scriptlet代码,也就是<%%>中的java代码,跟普通的java代码一样可以打断点单步调试的! 做个笔记,免得自己忘了!
- 常用Linux命令小结
常用Linux命令小结 Linux下有很多常用的很有用的命令,这种命令用的多了就熟了,对于我来说,如果长时间没有用的话,就容易忘记.当然,可以到时候用man命令查看帮助,但是,到时候查找的话未免有些临 ...
- C#基础(二)
变量的命名规则: 1.变量名由字母,数字 ,下划线组成.@ 中文 2.首字母,不能是数字 3.不能与关键字重名 变量的定义 语法: 数据类型 变量名[=值]; int a; //只定义变量 ...
- 下拉刷新控件(3)系统自带的下拉刷新控件SwipeRefreshLayout(推荐*)
1,简介 The SwipeRefreshLayout should be used whenever the user can refresh the contents of a view via ...
- 浅析JavaScript引用类型之--Object、Array
1.Object类型 对象是某个特定引用类型的实例,新对象有两种创建方式: i.使用new操作符调用构造函数来创建. var person = new Object(); person.name = ...
- UML类图几种关系的总结,泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖
在UML类图中,常见的有以下几种关系: 泛化(Generalization), 实现(Realization),关联(Association),聚合(Aggregation),组合(Compositi ...