zoukankan      html  css  js  c++  java
  • 数据库事务隔离级别

    数据库事务隔离级别

            数据库事务的隔离级别有4个,由低到高依次为Read uncommitted 、Read committed 、Repeatable read 、Serializable ,这四个级别可以逐个解决脏读 、不可重复读 、幻读 这几类问题。

                                    √: 可能出现    ×: 不会出现

      脏读 不可重复读 幻读
    Read uncommitted
    Read committed ×
    Repeatable read × ×
    Serializable × × ×

    关于read uncommitted方面
           今天下午一开始做的时候,一直不出现脏数据,后边重新理一遍,成功了,然后又花了半小时的时间
    去尝试之前不出现脏数据的原因,之后一直都是脏数据,所以就不知道我之前到底是哪出了问题,下边贴
    出成功后的操作图;
     
                          图1-1
     
                          图1-2
     
     
                          图1-3
     
            图1-1是我在第一个DOS系统下操作的命令,图1-2是在第二个DOS系统下操作的命令,而后再在第一个DOS
    系统下操作图1-3的命令发现,读到了未提交的事务。
     
    关于Read committed方面
           可以避免脏读,但不能避免不可重复读和幻读的情况
     
                      图2-1
     
                      图2-2
     
                      图2-3
           图2-1在DOS1下开启事务,并且查询当前reader表的数据,然后图2-2DOS2下修改数据,最后在
    DOS1的事务下重新查询reader表的数据,发现ID=6的数据发生了变化,这就是在同一个事务下,两次
    读取数据出现不一样的情况,即不可重复读。
     
    关于repeatable read(可重复读)
           mysql默认的事务隔离级别,可以避免脏读、不可重复读的问题,因为MYSQL的储存引擎通过多
    版本并发控制机制解决了幻读的问题,因此这个级别可以避免幻读了,以下是今天的测试:
     
                        图3-1
     
                        图3-2
     
                        图3-3
     
            图3-1在DOS1下开启事务,然后查询一下reader表数据,然后在DOS2下插入一条数据,再在DOS1中
    查询reader表的数据,发现数据没有没有改变,说明没有幻读。
     
    脏读、不可重复读、幻读概念:

    1. 脏读 :脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个

    事务也访问这个数据,然后使用了这个数据。

    2. 不可重复读 :是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,

    在第一个事务中的两 次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发

    生了在一个事务内两次读到的数据是不一样的,因此称为是不 可重复读。例如,一个编辑人员两次读取同一文档,但在两次

    读取之间,作者重写了该文档。当编辑人员第二次读取文档时,文档已更改。原始读取不可重复。如果 只有在作者全部完成

    编写后编辑人员才可以读取文档,则可以避免该问题。

    3. 幻读 : 是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的

    全部数据行。 同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个

    事务的用户发现表中还有没有修改的数据行,就好象 发生了幻觉一样。例如,一个编辑人员更改作者提交的文档,但当生产部门

    将其更改内容合并到该文档的主复本时,发现作者已将未编辑的新材料添加到该文档中。 如果在编辑人员和生产部门完成对原始

    文档的处理之前,任何人都不能将新材料添加到文档中,则可以避免该问题。

    摘自:https://www.cnblogs.com/wuxiang/p/5477807.html
     
    关于不可重复读、幻读,理解摘自贴吧:
    不可重复读的重点是修改:
    同样的条件, 你读取过的数据, 再次读取出来发现值不一样了
    幻读的重点在于新增或者删除
    同样的条件, 第1次和第2次读出来的记录数不一样
    当然, 从总的结果来看, 似乎两者都表现为两次读取的结果不一致.
    但如果你从控制的角度来看, 两者的区别就比较大
    对于前者, 只需要锁住满足条件的记录
    对于后者, 要锁住满足条件及其相近的记录
     
    避免不可重复读需要锁行就行
    避免幻影读则需要锁表
    贴吧链接地址:https://bbs.csdn.net/topics/120024254
     
    本文的参考链接:
    http://blog.csdn.net/jiesa/article/details/51317164
     
     
     
     
     
     
  • 相关阅读:
    Flink Table环境配置、读取外部数据(File、Kafka)以及查询转换
    Flink之Table初探
    Flink之Watermarks
    Flink之ProcessFunction侧输出流
    Flink之ProcessFunction案例
    Flink之Mysql数据CDC
    Express ejs 模板做的 app.js 文件
    金额转换文章(100=>零佰)
    将 音频流(MP3流)并进行播放
    浅谈MySQL(一):存储引擎与索引
  • 原文地址:https://www.cnblogs.com/shigeng/p/8603787.html
Copyright © 2011-2022 走看看