在MySQL文档中,隔离级别是个谈论比较少的话题。 文档只提供了简要的描述,主要关注锁这个主题,并没有讨论每个隔离级别的语义。 这不只是MySQL文档的问题,SQL标准本身也是。 文档的缺失、SQL标准深入讨论的缺失,使得DBA和developers对隔离级别这个话题很陌生。在这篇博客中,我主要介绍MySQL的默认隔离级别是怎样工作的,并给出一些两人惊奇的例子。 首先来看下在标准中,隔离级别是怎么描述的:“The transaction isolation level of a SQL-transaction defines the degree to which the operations on SQL-data, or schemas in that SQL-transaction are affected by the effects of and can affect operations on SQL-data or schemas in concurrent SQL-transactions”。 简单来说,就是隔离级别定义了并发事务在修改数据时,是如何相互影响的。 MySQL使用可重复读作为默认隔离级别。在标准中,这个级别禁止脏读(non-committed data)和不可重复读(执行相同的查询,应该返回相同的结果),允许幻读(新增行可见)。但是MySQL使用一个不同的方式实现。下面看几个具体的例子。
创建两个连接,并分别叫Session Blue (sb)和 Session Res(sr),创建对应的db和表repeatable_read。