zoukankan      html  css  js  c++  java
  • 事务的隔离级别

    由于隔离性是通过加锁的方式获得的,而锁会降低系统的性能,所以事务提供了控制隔离程度的机制。如果使用较高的隔离级别,则事务会比较好的与其他事务相隔离,当然也会带来大量的系统开销;如果使用较低的隔离级别,则事务的隔离性会比较差,但是能获得更好的性能。

    事务的隔离级别分为四种:READ_UNCOMMITED、READ_COMMITED、REPEATABLE_READ、SERIALIZABLE。要理解这些隔离级别的差异必须首先弄清如下几个概念:脏读、不可重复读、幻影读取。

    假设同一个A和B两个同时并发操作数据库,A和B执行的任务如下:从数据库中读取整数N,将N加上10,将新的N更新回数据库。这两个并发执行的实例可能发生下面的执行顺序。

    (1)A从数据库中读取整数N,当前数据库中N=0;

    (2)N 加上10,并将其更新到数据库中,当前数据库中N=10。然而由于A 的事务还没有提交,所以数据库更新还没有称为持久性的;

    (3)B从数据库中读取整数N,当前数据库中N=10;

    (4)A回滚了事务,所以N 恢复到了N=0;

    (5)B将N 加上10,并将其更新到数据库中,当前数据库中N=20;

    这里出现了B在A提交之前读取了A所更新的数据,由于A回滚了事务,所以数据库中出现了错误的数据20。尽管A回滚了事务,但是A更新的数据还是间接的通过B被更新到了数据库中。这种读取了未提交的数据的方法就叫脏(dirty)读问题。

    当一个用户从数据库中读取数据的时候,另外一个用户修改了这条数据,所以数据发生了改变,当再次读取的时候就出现了不可重复读取问题。比如:

    (1)A从数据库中读取整数N;

    (2)B以一个新的值更新N;

    (3)当A再次从数据库中读取N 的时候,会发现N 的值变了;

    幻影读取指的是在两次数据库操作读取操作之间,一组新的数据会出现在数据库中。比如:

    (1)A从数据库检索到了一些数据;

    (2)B通过Insert语句插入了一些新数据;

    (3)A再次查询的时候,新的数据就会出现;

    了解了这几个概念,下面来看一下四种事务的隔离级别的区别:

    1,使用READ_UNCOMMITED级别,会导致脏读问题、幻影读取问题和不可重复读取问题。在需要敏感计算任务的事务中,这样的模式是不太适合的;

    2,使用READ_COMMITED级别,可以解决脏读问题,但是还会有幻影读取问题和不可重复读取问题。这种级别一般用于制作报表。这种模式是大部分系统的默认级别;

    3,使用REPEATABLE_READ 级别,可以解决脏读问题和不可重复读取问题,但是会有幻影读取问题;

    4,使用SERIALIZABLE 级别可以解决脏读问题、幻影读取问题和不可重复读取问题。这是最严格级别的隔离级别;

  • 相关阅读:
    Ubuntu14.04手动安装配置jdk sdk ndk ant
    Ubuntu中(桌面或者文件夹)右键鼠标打开终端设置
    C语言中固定长度和不定长度的数组初始化示例
    Algorithm Design——最大公约数、最小公倍数
    Algorithm Design——凸包
    Algorithm Design——判断线段是否相交
    Algorithm Design Everyday——2.查找学生信息
    Algorithm Design——查找
    Algorithm Design——高精度整数四则运算
    Algorithm Design——并查集
  • 原文地址:https://www.cnblogs.com/yuyu666/p/9828073.html
Copyright © 2011-2022 走看看