举例分析:

我们有A表, 包含两条数据。
Read uncommitted:
假设我们有两个事务 Trans1, Trans2. 它们的操作如下:
Trans 1: 更新A1 -> A11, 然后更新A2 -> A22.
Trans 2: 读取A表中的第一条数据.
 
当trans1执行完第一步但还没开始第二部的时候,trans2开始读取A表中的第一条数据,这时trans2读到的值是A11. 但是这样带来的风险就是如果trans2在执行第二步的时候出错,那A11会回滚变成A1. 也就是说trans2 读到是trans1还没有提交事务的数据(脏数据)。

Read committed

在Read Committed Level下, 我们能避免 read uncommitted提到脏数据的问题。
还是两个事务 Trans 1, Trans 2. 它们的操作如下:
Trans 1: 更新A1 -> A11, 读取A2.
Trans 2: 读取A表中第一条数据。
 
当trans1执行完第一步更新A1->A11还没开始第二步的时候, trans2开始读取A表中的第一条数据, 这时trans2是读取不到数据的. 因为Trans1已经对A1施加了write锁,write锁是贯穿整个事务的。别的事务要想访问A1, 必须等到trans1执行完把锁释放掉才可以。那样trans2会等到trans1事务执行完读取到值A11。
 
但是在read committed模式下Read 锁是会在读完后马上释放掉的
Trans1: 读取A2,更新A2 -> A22。
Trans2: 更改A2->A22。
 
当trans1读完A2还没开始第二步的时候, trans2开始修改A2->A22. 因为在Read committed模式下, 读取锁会在读完后立马释放掉,所以trans2是可以修改A2的。
 
因为read committed模式下Read 锁是会在读完后马上释放掉,这样的话,我们就不能保证一个事务中两次相同的查询的结果是一样的,因为数据可能被另外一个事务给修改掉。
举例说明:
还是两个事务 Trans1, Trans2.
Trans1: 读取第一条数据, 读取第一条数据.
Trans2: 修改A表中第一条数据A1->A11。
 
当trans1执行完第一步但还没开始第二部的时候,  trans2事务会修改A1->A11. 那样trans1中第二部读到的数据就跟第一步不一样了,要想解决这个问题就要参照Repeatable read模式了

Repeatable reads

Repeatable reads模式很好的解决掉了Read committed多次读取数据不一致的问题,因为在这种level下, read 锁跟 write锁一样是要贯穿整个transaction, 而不是使用完就释放掉。 但是它不能解决新插入的数据,新插入的数据没有进行锁限制。 也就是所Repeatable read模式能保证在一个事务中多次相同查询读取的老数据内容是一样的但是数据条数不一定一样。 因为可能另外一个事务会在两次读取中间插入新的数据。
 

Serializable

Serializable是最严格的锁,它保证的一个事务中多次相同查询读取的数据是一样的,条数也是一样的。
 
注意: 锁越严格,性能就会越差,在真正的项目中,我们要根据我们的需求,选在合适的level. 找到平衡点。

事务Isolation Level 例子详解的更多相关文章

  1. Mysql 事务隔离级别(图文详解)

    本文由 SnailClimb 和 BugSpeak 共同完成. 事务隔离级别(图文详解) 什么是事务? 事物的特性(ACID) 并发事务带来的问题 事务隔离级别 实际情况演示 脏读(读未提交) 避免脏 ...

  2. SQL Server 表的管理_关于事务的处理的详解(案例代码)

    SQL Server 表的管理_关于事务的处理的详解(案例代码) 一.SQL 事务 1.1SQL 事务 ●事务是在数据库上按照一定的逻辑顺序执行的任务序列,既可以由用户手动执行,也可以由某种数据库程序 ...

  3. Lambda表达式详解(例子详解)(转自:http://blog.csdn.net/damon316/article/details/51734661)

    Lambda表达式详解(例子详解)     lambda简介 lambda运算符:所有的lambda表达式都是用新的lambda运算符 " => ",可以叫他,“转到”或者 ...

  4. MySQL事务及隔离级别详解

    MySQL事务及隔离级别详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL的基本架构 MySQL的基本架构可以分为三块,即连接池,核心功能层,存储引擎层. 1> ...

  5. windows scala helloworld例子详解

    [学习笔记] windows scala helloworld例子详解: 在操作系统中,我们的Test3.scala会生成Test3.class,然后class文件被虚拟机加载并执行, 这一点和jav ...

  6. Spring声明式事务管理与配置详解

    转载:http://www.cnblogs.com/hellojava/archive/2012/11/21/2780694.html 1.Spring声明式事务配置的五种方式 前段时间对Spring ...

  7. mysql是如何实现事务隔离以及MVCC详解

    提到事务,你肯定会想到ACID(Atomicity.Consistency.Isolation.Durability,即原子性.一致性.隔离性.持久性),我们就来说说其中I,也就是"隔离性& ...

  8. SQL Server事务、隔离级别详解(二十九)

    前言 事务一直以来是我最薄弱的环节,也是我打算重新学习SQL Server的出发点,关于SQL Server中事务将分为几节来进行阐述,Always to review the basics. 事务简 ...

  9. SQL Server-聚焦事务、隔离级别详解(二十九)

    前言 事务一直以来是我最薄弱的环节,也是我打算重新学习SQL Server的出发点,关于SQL Server中事务将分为几节来进行阐述,Always to review the basics. 事务简 ...

随机推荐

  1. PHP中用mysqli面向对象打开连接关闭mysql数据库

    代码如下: <meta http-equiv="content-type" content="text/html" charset="utf-8 ...

  2. VS2015+TFS2015源代码管理

    使用Visual Studio连接TFS

  3. RedHat7配置Nginx实现多域名虚拟主机的SSL/TLS认证(实现单IP以不同证书服务于不同域名)

    以RedHat7(64bit)平台为例 如果RedHat源没法用,可以使用EPEL源 # rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-rel ...

  4. HDU-1113(map的运用)

    Word Amalgamation Problem Description In millions of newspapers across the United States there is a ...

  5. Codeforces Round #310 (Div. 2)--A(简单题)

    http://codeforces.com/problemset/problem/556/A 题意:给一个01字符串,把所有相邻的0和1去掉,问还剩下几个0和1. 题解:统计所有的0有多少个,1有多少 ...

  6. MyXLS案例

    using System; using System.Data; using org.in2bits.MyXls; namespace Maticsoft.Common { /// <summa ...

  7. .net 关于数据库的链接

    web.config的配置 <appSettings> <add key="Configpath" value="~/XmlConfig/webset. ...

  8. 多线程与Socket编程

    一.死锁 定义: 指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁 ...

  9. 消息处理之EventBus ——使用篇

    以前的几篇文章简单的介绍了一下UI线程和子线程之间的线程通信利器Handler,以及顺便介绍了一下SyncTask和HeadlerThread.这里介绍另一线程通信利器EventBus. EventB ...

  10. 使用java的Calendar对象获得当前日期的上几个度开始、结束时间

    思路: 先获得当前季度的开始和结束日期,在当前日期的基础上往前推3个月即上个季度的开始和结束日期 /** * @param flag true:开始日期:false:结束日期 * @return */ ...