ANSI/ISO SQL标准定义了4中事务隔离级别:未提交读(read uncommitted),提交读(read committed),重复读(repeatable read),串行读(serializable)。

一、对于不同的事务,采用不同的隔离级别分别有不同的结果。不同的隔离级别有不同的现象。主要有下面3种现在:

1、脏读(dirty read):一个事务可以读取另一个尚未提交事务的修改数据。

2、非重复读(nonrepeatable read):在同一个事务中,同一个查询在T1时间读取某一行,在T2时间重新读取这一行时候,这一行的数据已经发生修改,可能被更新了(update),也可能被删除了(delete)。

3、幻像读(phantom read):如果另一个事务同时提交了新数据,本事务再更新时,就会“惊奇的”发现了这些新数据,貌似之前读到的数据是“鬼影”一样的幻觉。

幻读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,比如这种修改涉及到表中的“全部数据行”。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入“一行新数据”。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样.一般解决幻读的方法是增加范围锁RangeS,锁定检锁范围为只读,这样就避免了幻读。

不同的隔离级别有不同的现象,并有不同的锁定/并发机制,隔离级别越高,数据库的并发性就越差,4种事务隔离级别分别表现的现象如下表:

隔离级别 脏读 非重复读 幻像读
read uncommitted 允许 允许 允许
read committed   允许 允许
repeatable read     允许
serializable      

二、数据库中的默认事务隔离级别

在Oracle中默认的事务隔离级别是提交读(read committed)。

对于MySQL的Innodb的默认事务隔离级别是重复读(repeatable read)。可以通过下面的命令查看:

mysql> SELECT @@GLOBAL.tx_isolation, @@tx_isolation;

+———————–+—————–+

| @@GLOBAL.tx_isolation | @@tx_isolation  |

+———————–+—————–+

| REPEATABLE-READ | REPEATABLE-READ |

+———————–+—————–+

1 row in set (0.00 sec)

下面进行一下测试:

Time Session 1 Session 2
T1 set autocommit=0; set autocommit=0;
T2 mysql> select * from tmp_test;

+——+———+ | id   | version | +——+———+ |    1 |       1 | +——+———+

1 row in set (0.00 sec)

 
T3   mysql> update tmp_test set version=2 where id=1;

Query OK, 1 row affected (0.02 sec)

Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from tmp_test;

+——+———+ | id   | version | +——+———+ |    1 |       2 | +——+———+

1 row in set (0.00 sec)

T4 mysql> select * from tmp_test;

+——+———+ | id   | version | +——+———+ |    1 |       1 | +——+———+

1 row in set (0.00 sec)

【说明】 Session 2未提交,看到数据不变,无脏读。

 
T5   commit;
T6 mysql> select * from tmp_test;

+——+———+ | id   | version | +——+———+ |    1 |       1 | +——+———+

1 row in set (0.00 sec)

【说明】 Session 2已经提交,还是看到数据不变,即可以重复读。

 
T7 commit;  
T8 mysql> select * from tmp_test;

+——+———+ | id   | version | +——+———+ |    1 |       2 | +——+———+

1 row in set (0.00 sec)

【说明】 提交事务,看到最新数据。

 
T9   mysql> insert into tmp_test values(2,1);

Query OK, 1 row affected (0.00 sec)

mysql> select * from tmp_test;

+——+———+ | id   | version | +——+———+ |    1 |       2 | |    2 |       1 | +——+———+

2 rows in set (0.00 sec)

mysql> commit;

Query OK, 0 rows affected (0.00 sec)

T10 mysql> select * from tmp_test;

+——+———+ | id   | version | +——+———+ |    1 |       2 | +——+———+

1 row in set (0.00 sec)

【说明】 Session 2的insert事务已经提交,看到的数据和T8的时候一样,即可重复读。

 
T11 mysql> commit;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from tmp_test;

+——+———+ | id   | version | +——+———+ |    1 |       2 | |    2 |       1 | +——+———+

2 rows in set (0.00 sec)

【说明】 事务提交,看到最新数据。

 

上面的结果可以看到Innodb的重复读(repeatable read)不允许脏读,不允许非重复读(即可以重复读,Innodb使用多版本一致性读来实现)和不允许幻象读(这点和ANSI/ISO SQL标准定义的有所区别)。

另外,同样的测试:

1、当session 2进行truncate表的时候,这个时候session 1再次查询就看不到数据。

2、当session 2进行alter表的时候,这个时候session 1再次查询就看不到数据。

这块还有点疑问,在5.1版本中测试时发现,当session 2执行truncate表操作时,会被session1 阻塞???是上面这两句说的不对还是上面这两句适合别而高版本?

造成以上的原因是因为 mysql的持续非锁定读,在repeatable read级别下,读采用的是持续非锁定读。相关介绍见下面:

持续读意味着InnoDB使用它的多版本化来给一个查询展示某个时间点处数据库的快照。查询看到在那个时间点之前被提交的那些确切事务做的更改,并且没有其后的事务或未提交事务做的改变。这个规则的例外是,查询看到发布该查询的事务本身所做的改变。

如果你运行在默认的REPEATABLE READ隔离级别,则在同一事务内的所有持续读读取由该事务中第一个这样的读所确立的快照。你可以通过提交当前事务并在发布新查询的事务之后,为你的查询获得一个更新鲜的快照。

持续读是默认模式,在其中InnoDBzai在READ COMMITTED和REPEATABLE READ隔离级别处理SELECT语句。持续读不在任何它访问的表上设置锁定,因此,其它用户可自由地在持续读在一个表上执行的同一时间修改这些表。

注意,持续读不在DROP TABLE和ALTER TABLE上作用。持续读不在DROP TABLE上作用,因为MySQL不能使用已经被移除的表,并且InnoDB 破坏了该表。持续读不在ALTER TABLE上作用,因为它在某事务内执行,该事务创建一个新表,并且从旧表往新表中插入行。现在,当你重新发出持续读之时,它不能在新表中看见任何行,因为它们被插入到一个在持续读读取的快照中不可见的事务 里。

Innodb事务隔离级别-repeatable read详解相关推荐

  1. mysql repeatableread_mysql-Innodb事务隔离级别-repeatable read详解(转)

    一.事务隔离级别 ANSI/ISO SQL标准定义了4中事务隔离级别:未提交读(read uncommitted),提交读(read committed),重复读(repeatable read),串 ...

  2. mysql repeatableread_mysql-Innodb事务隔离级别-repeatable read详解1

    经验总结: Python使用MySQLdb数据库后,如使用多线程,每个线程创建一个db链接,然后再各自创建一个游标cursor,其中第一个线程读一个表中数据为空,第二个写入该表一条数据并提交,第一个线 ...

  3. mysql-事务隔离级别以及锁详解

    目录 一.事务的隔离级别 什么是事务.事务有哪些特性 持久性:事务一旦提交,它对数据库中的数据的改变就是永久性的 事务并发情况下可能会产生的问题有哪些 事务的隔离级别有哪些?默认的隔离级别是什么? 在 ...

  4. mysql innodb 默认隔离级别_MySQL Innodb 事务隔离级别

    在Mysql中,事务主要有四种隔离级别,今天我们主要是通过示例来比较下,四种隔离级别实际在应用中,会出现什么样的对应现象. Read uncommitted (未提交读) Read committed ...

  5. 6. 事务隔离级别之Repeatable Read

    接下来我们学习Mysql默认的事务隔离级别Repeatable Read,顾名思义,可重复读,也即在一个事务范围内相同的查询会返回相同的数据. 延续上面的栗子: 1. 小明很开心自己考了69分,于是他 ...

  6. mysql四种事务隔离级别

    mysql事务并发问题 ACID什么的就不啰嗦了.mysql多个事务并发的时候,可能会出现如下问题: 1. 更新丢失 即两个事务同时更新某一条数据,后执行的更新操作会覆盖先执行的更新操作,导致先执行的 ...

  7. mysql四种输入_mysql四种事务隔离级别

    mysql事务并发问题 ACID什么的就不啰嗦了.mysql多个事务并发的时候,可能会出现如下问题: 1. 更新丢失 即两个事务同时更新某一条数据,后执行的更新操作会覆盖先执行的更新操作,导致先执行的 ...

  8. js hbs mysql_实例分析MySQL下的四种事务隔离级别

    数据库事务有四种隔离级别: 未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据. 提交读(Read Committed):只能读取到已经提交的数据, ...

  9. mysql数据库事务隔离级别演示

    mysql数据库事务隔离级别演示 关键词: 一.基本概念 二.事务的四个特性(ACID) 三.事务的用法 3.1 相关命令 3.2 使用步骤 四.数据库的隔离级别 五.示例演示(每组事务结束手动com ...

最新文章

  1. jzoj3794,P1383-高级打字机【欧拉序,离线O(n)】
  2. 剪映专业版PC端清理缓存与日志
  3. CentOS6.5下安装iRedMail中需要解决的问题
  4. ES6高级技巧(五)
  5. 中国5G标准专利数量遥遥领先:不卖产品也获利
  6. java程序报错后跳过继续执行_java笔记.基础篇.基本数据类型
  7. 【开源项目经验】之计算PSNR
  8. qutebrowser 只用键盘操作的浏览器
  9. 使用W3C标准的DOM处理XML文件[C++和Java版]
  10. 区块链3.0时代:你现在所有的认知将会被颠覆
  11. Servlet和JSP
  12. 3.8 51单片机-M74HC138译码器驱动8位数码管
  13. 【摘录】Thinkpad T410i-2516A21 安装Ubuntu10.0.4记录
  14. 定量/高光谱遥感之——光谱分析技术
  15. 笔记木计算机自动关机怎么办,为什么笔记本电脑自动关机 笔记本电脑自动关机解决方法...
  16. 感动的眼泪流下来。。。。中文ecli…
  17. Axure RP-产品原型设计工具使用
  18. idea 右侧的maven没有dependencies
  19. Vue:获取v-for循环中的数组下标、索引及数据
  20. Vs2005中操作WORD

热门文章

  1. 读后感: 懈寄生---走出软件作坊:三五个人十来条枪 如何成为开发正规军(十四)
  2. C/C++申请和释放内存
  3. 立创eda学习笔记二十六:手把手教你使用立创eda的官方教程
  4. 爬虫君子协议-robots.txt协议
  5. uploadify上传图片
  6. 诚聘.NET高级软件工程师
  7. NOIP 2014 飞扬的小鸟
  8. U3D_Maze开发手记
  9. 转:伟大的进展,都源于承认无知,源于思想自由
  10. winrar分卷压缩和解压