码迷,mamicode.com
首页 > 数据库 > 详细

数据库事务隔离级别

时间:2018-03-19 19:02:14      阅读:223      评论:0      收藏:0      [点我收藏+]

标签:取数据   repeat   编辑   class   details   logs   body   分享图片   改变   

数据库事务隔离级别

 

        数据库事务的隔离级别有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
 
 
 
 
 
 

数据库事务隔离级别

标签:取数据   repeat   编辑   class   details   logs   body   分享图片   改变   

原文地址:https://www.cnblogs.com/shigeng/p/8603787.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!