1.设置为读未提交

SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

2.查看隔离级别

SELECT @@tx_isolation;

3.session A开启事务TA 执行插入操作

4.在另一个session B的事务TB中查询数据

5.此时如果TA执行ROLLBACK; 回滚数据,

6.TB再次查询无结果。

根据测试结果可以看到,TB如果第一次查询获取到TA中尚未提交的数据,之后TA又回滚了数据,会造成读脏数据。

如果要避免读脏数据,至少要把事务隔离级别设为:1.2 READ COMMITTED(读已提交)

由于读未提交的隔离级别很低,在并发情况下,数据一致性并不能得到保证。但它也并非一无是处,至少事务帮我们保证了原子性,持久性。下面看一下MySql怎么做到这些的。

InnoDB表中除了每个字段的值,还包含了一些隐藏信息: DELETE BIT,DB_TRX_ID,DB_ROLL_PTR,DB_ROW_ID

DELETE BIT位用于标记该记录是否被删除,被标记的数据在commit时才真正被删除

6字节的DB_TRX_ID,系统版本号, 每开启一个事务,系统版本号都会自动递增

7字节的DB_ROLL_PTR 指向当前记录项的Undo log记录,回滚时通过这个指针找到历史数据

6字节的DB_ROW_ID,当由innodb自动产生聚集索引时,聚集索引包括这个DB_ROW_ID的值,否则聚集索引中不包括这个值,这个用于索引当中

重点关注DELETE BIT,DB_TRX_ID,DB_ROLL_PTR,下图表示某表中的一条数据,

Undo log存放在表空间中,作用是保存各个事务操作数据库的历史,用于回滚。Undo log分insert和update两类,因为insert时,原始的数据并不存在,所以回滚时把insert Undo log的数据丢弃即可,而update Undo log则必须遵守以下过程。

一下是事务T2再次提交时,发生的改变,Undo log增加了上一版本数据的备份,Undo log不会一直变大,

MySql的purge线程会把当前最早开启的事务之前的Undo log清除。

由此可见事务提交时InnoDB什么都不需要做,如果回滚,需要从Undo log中恢复数据,Undo log中数据越多恢复事件就越长,InnoDB提交的效率要比回滚高。

上文提到了Redo log,它和Undo log相反,Redo log记录的是新数据的备份。在事务提交前,只要将Redo log持久化即可,不需要将数据持久化。当系统崩溃时,虽然数据没有持久化,但是Redo log已经持久化。Redo log与Undo log另一个区别在于它在磁盘上作为一个独立的log文件存在。系统可以根据Redo log的内容,将所有数据恢复到最新的状态。

实际上数据写到磁盘是一个复杂的过程,并不仅仅记录了Redo log,为了提高性能,减少IO次数,做了很多缓冲处理,下面做个记录带研究:

1.InnoDB buffer pool, Redo log buffer。这个是InnoDB应用系统本身的缓冲。

2.page cache /Buffer cache(可通过o_direct绕过)。这个是vfs层的缓冲。

3.Inode cache/directory buffer。这个也是vfs层的缓冲。需要通过O_SYNC或者fsync()来刷新。

4.Write-Back buffer。(可设置存储控制器参数绕过)

5.Disk on-borad buffer。(可通过设置磁盘控制器参数绕过)

数据何时写入磁盘也有多种可能性:

1.已提交的数据,写入到数据文件,这种是正常情况。

2.数据已经提交,但是还没有写入数据文件,这种情况可能是正在写,也可能是异常停机,数据会根据Redo log写入磁盘。

3.数据没有提交,但是已经写入到数据文件,出现检查点,数据缓冲区空间不够等情况。

如果出现上述第三种情况,也并不会出现异常,

在redo buffer和undo中对该事务都有一个是否提交的标记。两者的默认状态都是active的,即没有提交时刻处于激活状态,commit成功后,redo buffer信息全部写入redo file,同时修改两者中的事务提交标识为inactive。未commit的话,事务依旧是active,所以数据即使被提前写入了数据文件也没关系。

参考:

http://blog.csdn.net/longxibendi/article/details/39835185

1.1MySQL-InnoDB-READ UNCOMMITTE(读未提交)相关推荐

  1. MySQL事务隔离级别:可重复读、读已提交、读未提交。实操

    MySQL的事务隔离级别: 目录 一.可重复读(默认) REPEATABLE-READ: 二.读已提交  READ-COMMITTED: 一.可重复读(默认) REPEATABLE-READ: 准备实 ...

  2. 事务隔离级别——READ-UNCOMMITTED(读未提交)

    首先,我们先设置MySQL事务隔离级别为READ-UNCOMMITTED 在my.ini配置文件最后加上如下配置 #可选参数有:READ-UNCOMMITTED, READ-COMMITTED, RE ...

  3. 数据库基础知识点-事务隔离级别区分(读未提交、读已提交和可重复读)

    事务隔离级别 数据库事务隔离级别分4个: 读未提交-Read uncommitted 读已提交-Read committed 可重复读-Repeatable read–MySQL 序列化-Serial ...

  4. 看完这篇文章,让你彻底理解事务隔离级别(读未提交、读已提交、可重复读、序列化)

    对于不同的事务,采用不同的隔离级别分别有不同的现象.主要有下面3种: 1.脏读(dirty read):一个事务可以读取另一个尚未提交事务的修改数据. 2.不可重复读(nonrepeatable re ...

  5. Mysql学习笔记之事务详解(读未提交、读以提交、可重复读、串行化读)

    文章目录 1.事务概述 2.事务特性 3.事务隔离级别 4.演示事务 4.1.演示读未提交 4.2.演示读已提交 4.3.演示可重复读 4.4.演示串行化读 1.事务概述 什么是事务? 一个事务是一个 ...

  6. PostgreSQL事物隔离级别之读未提交

    读未提交 一个事务在执行过程中可以看到其他并发事务未提交的新增数据,或者并发事务未提交的修改数据.脏读就有可能发生在该隔离级别的事务中.脏读是一个事务读取到了并发事务未提交的数据.譬如:事务A读取的并 ...

  7. MySQL读未提交级别究竟是否加锁

    最近在学习MySQL的隔离级别问题,网上的大部分说法都是:读未提交级别下不加任何锁,然而又有资料指出:MySQL在四种隔离级别下都能防止丢失更新,这两种说法看起来互相矛盾,所以我实际测试并得出了结论: ...

  8. mysql 读未提交数据_mysql事务之未提交读(Read uncommitted)

    1,Read uncommitted定义: wiki上的定义如下: 未提交读(READ UNCOMMITTED)是最低的隔离级别.允许脏读(dirty reads),事务可以看到其他事务"尚 ...

  9. 隔离级别(未提交读、提交读、可重复读、可串行化)、多版本并发控制、Next-Key Locks(Record Locks、Gap Locks)

    1. 隔离级别 1.1 未提交读(READ UNCOMMITTED) 事务中的修改,即使没有提交,对其它事务也是可见的. 1.2 提交读(READ COMMITTED) 一个事务只能读取已经提交的事务 ...

最新文章

  1. 迎娶了校花的学霸,竟把日子过成了这个样子!
  2. 【 Vivado 】打包属于自己的IP
  3. Maven远程仓库:pom依赖以及jar包下载
  4. js-cookie 无法设置cookie_php操作 cookie
  5. go语言var 和make_Var和语言设计
  6. vaex 处理海量数据_核心业务“瘦身”进行时!手把手带你搭建海量数据实时处理架构...
  7. 什么是python之禅_【Python面试】你了解什么是 Python 之禅么?
  8. numpy合并两个ndarry或多个
  9. sklearn 线性回归
  10. 【ElasticSearch】IK分词加入标点符号
  11. quartz的负载均衡
  12. Python把类当做字典来访问
  13. 选择尽可能多的不相交区间
  14. java线程知识点拾遗(1)
  15. 刘宇凡:从吃饭中的道理领悟SEO
  16. R语言编写用户自定义函数:R语言编写用户自定义函数计算变异系数(coefficient of variation)、输入为向量
  17. 解决报错 We‘re sorry but doesn‘t work properly without JavaScript enabled. Please enable it to continue.
  18. matlab中图像显示函数
  19. Yarn主导资源公平性调度算法
  20. PHP PEAR网站遭黑客入侵,官方软件安装包被篡改

热门文章

  1. Android原生编解码接口MediaCodec详解
  2. C语言求1000以内的素数
  3. 使用QrCode解析二维码
  4. 上海市智慧养老解决方案,适应新要求的新导智能
  5. linux上安装python、igraph源码包_windows环境安装python-igraph全过程
  6. MAC JDK 卸载方法、环境配置
  7. vue 中的scoped原理
  8. 【知识小记】Word转化为高清PDF
  9. ORCAL数据库问题:日志文件损坏解决方案
  10. python跳一跳脚本详解_微信跳一跳游戏 python脚本辅助得高分