继续昨天的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)的更多相关文章

  1. mysql innodb锁简析(1)

    说好的每天一个技术博客,选了iteye,但是,那个界面真的好丑啊,丑的让我都没写下去的欲望了,所以,还是转移到博客园里面吧,虽然这里也是很丑的! 直接步入正题: 1. 数据库锁包括:读锁(可共享锁)和 ...

  2. mysql: 关于MySQL InnoDB锁行还是锁表?

          baidu zone - 关于MYSQL Innodb 锁行还是锁表,深入讲解

  3. [转]关于MYSQL Innodb 锁行还是锁表

    关于mysql的锁行还是锁表,这个问题,今天算是有了一点头绪,mysql 中 innodb是锁行的,但是项目中居然出现了死锁,锁表的情况.为什么呢?先看一下这篇文章. 目时由于业务逻辑的需要,必须对数 ...

  4. MySQL InnoDB锁机制

    概述: 锁机制在程序中是最常用的机制之一,当一个程序需要多线程并行访问同一资源时,为了避免一致性问题,通常采用锁机制来处理.在数据库的操作中也有相同的问题,当两个线程同时对一条数据进行操作,为了保证数 ...

  5. mysql InnoDB锁等待的查看及分析

    说明:前面已经了解了InnoDB关于在出现锁等待的时候,会根据参数innodb_lock_wait_timeout的配置,判断是否需要进行timeout的操作,本文档介绍在出现锁等待时候的查看及分析处 ...

  6. RDS MySQL InnoDB 锁等待和锁等待超时的处理

    https://help.aliyun.com/knowledge_detail/41705.html 1. Innodb 引擎表行锁等待和等待超时发生的场景 2.Innodb 引擎行锁等待情况的处理 ...

  7. MySQL InnoDB锁机制之Gap Lock、Next-Key Lock、Record Lock解析

    MySQL InnoDB支持三种行锁定方式: l   行锁(Record Lock):锁直接加在索引记录上面,锁住的是key. l   间隙锁(Gap Lock):锁定索引记录间隙,确保索引记录的间隙 ...

  8. 你需要知道的MySQL&InnoDB锁都在这里

    目录 一.前言 二.锁的类型 2.1 全局锁 2.2 表级锁 2.2.1 表锁 2.2.2 元数据锁(Meta Data Locks) 2.2.3 自增列锁(AUTO-INC Locks) 2.2.4 ...

  9. mysql——InnoDB 锁

    https://www.cnblogs.com/leedaily/p/8378779.html 1.InnoDB锁的实现方式:给索引项加锁,只有通过索引条件检索数据,InnoDB才使用行级锁,否则,I ...

随机推荐

  1. 轻松大幅度降低 Meteor App 的首屏加载时间

    许多研究表明,用户最满意的网页加载时间是在2秒以下.能够忍受的较长等待时间上限大概在6-8秒之间.如果需要等待12秒,99%以上的用户会关闭网页离开. 所以如果要给用户提供愉快的使用体验,尽量做到 2 ...

  2. 使用CSS3制作漂亮的按钮

    我给大家介绍一下如何使用CSS3来制作一个圆角阴影.渐变色的漂亮的按钮,它不需要任何图片和javascript脚本,只需要CSS3就可以轻松实现按钮效果,并且可以适用于任意HTML元素,想div,sp ...

  3. Python模块包中__init__.py文件的作用

    转载自:http://hi.baidu.com/tjuer/item/ba37ac4ce7482a0f6dc2f08b 模块包: 包通常总是一个目录,目录下为首的一个文件便是 __init__.py. ...

  4. C++的优势以及用途

    C++不一定更快,但C++给你更快的机会 C++始终没有放弃的东西,一是代码表达力,二是对机器的控制力,这是其长处也是其短处,但是如果不想绑死在某平台的战车上,这两处绝对必要. 所有的平台厂商都会自称 ...

  5. Pipeline aborted due to error

    报错内容 x. Pipeline aborted due to error {:exception=>"LogStash::ConfigurationError", ... ...

  6. Netty4.x中文教程系列(五)编解码器Codec

    Netty4.x中文教程系列(五)编解码器Codec 上一篇文章详细解释了ChannelHandler的相关构架设计,版本和设计逻辑变更等等. 这篇文章主要在于讲述Handler里面的Codec,也就 ...

  7. .NET中使用OleDb读取Excel

    在.NET中可以用OleDb(Object linking and embeding DataBase)来访问Excel using System; using System.Data; using ...

  8. Linux内核基础--事件通知链(notifier chain)

    转载: http://blog.csdn.net/wuhzossibility/article/details/8079025 http://blog.chinaunix.net/uid-277176 ...

  9. 笔记三、apache搭建gitweb【转】

    参考文章:     http://www.latelee.org/using-gnu-linux/ubuntu-apache-gitweb.html     http://blog.csdn.net/ ...

  10. make clean、make mrproer、make distclean

    make clean.make mrproer 以及make distclean的区别 解压内核源码包后, 到内核源代码目录树的顶层目录, 执行# make helpCleaning targets: ...