继续昨天的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. nasm fasm yasm 还是masm、gas

    留个爪,稍后学习 选择编译器nasm?fasm?yasm?还是masm.gas或其他? 前面三个是免费开源的汇编编译器,总体上来讲都使用Intel的语法.yasm是在nasm的基础上开发的,与nasm ...

  2. VCL设计方法概论(自己总结了9条),以及10个值得研究的控件 good

    VCL设计方法概论 1. 把Delphi对象改造成一个Windows窗口,主要是要设置Handle和回调函数.在创建一个Windows窗口后,将其句柄赋值给Delphi对象的属性,这个并不难,相当于从 ...

  3. C++:构造函数默认的参数声明

    C++函数的默认参数指的是在函数声明或者定义时给形式参数指定默认值,从而在调用参数时可以少写参数,少掉的参数用默认值代替.LZ的Display()函数的代码看起来似乎是可以有s2和s3两个默认参数,那 ...

  4. linux select

    man select: #include <sys/select.h> #include <sys/time.h> int select(int nfds, fd_set *r ...

  5. HDU 4643 GSM 算术几何

    当火车处在换基站的临界点时,它到某两基站的距离相等.因此换基站的位置一定在某两个基站的中垂线上, 我们预处理出任意两基站之间的中垂线,对于每次询问,求询问线段与所有中垂线的交点. 检验这些交点是否满足 ...

  6. c# 浏览器区别

    c#   浏览器区别 思路:浏览器本身独有的属性来区别: 1.window对象的属性来区别: window.attachEvent               IEwindow.addEventLis ...

  7. hdu1005 Number Sequence(数论)

    Number Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tot ...

  8. Ubuntu Server搭建svn服务以及迁移方法【转】

    转自:http://www.linuxidc.com/Linux/2013-05/84693.htm Ubuntu Server搭建svn服务以及迁移方法 采用apache+svn,http访问方式. ...

  9. C# 中通过API实现的打印类

    using System;using System.Collections;using System.Text;using System.Runtime.InteropServices; using ...

  10. js和 jquery对象

    核心提示:jquery选择器得到的jquery对象和标准的 javascript中的document.getElementById()取得的dom对象是两种不同的对象类型,一般情况下,如S(’#id’ ...