一文带你轻松搞懂事务隔离级别( 二 )


  •  
mysql> SELECT @@tx_isolation;+-----------------+| @@tx_isolation |+-----------------+| REPEATABLE-READ |+-----------------+这里需要注意的是:与 SQL 标准不同的地方在于InnoDB 存储引擎在 REPEATABLE-READ(可重读)事务隔离级别下使用的是Next-Key Lock 锁算法,因此可以避免幻读的产生,这与其他数据库系统(如 SQL Server)是不同的 。所以说InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读) 已经可以完全保证事务的隔离性要求,即达到了 SQL标准的SERIALIZABLE(可串行化)隔离级别 。
因为隔离级别越低,事务请求的锁越少,所以大部分数据库系统的隔离级别都是READ-COMMITTED(读取提交内容):,但是你要知道的是InnoDB 存储引擎默认使用 REPEATABLE-READ(可重读)并不会有任何性能损失 。
InnoDB 存储引擎在 分布式事务 的情况下一般会用到SERIALIZABLE(可串行化)隔离级别 。
实际情况演示
MySQL 命令行的默认配置中事务都是自动提交的,即执行SQL语句后就会马上执行 COMMIT 操作 。如果要显式地开启一个事务需要使用命令:START TARNSACTION 。
我们可以通过下面的命令来设置隔离级别 。
  •  
SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL [READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE]我们再来看一下我们在下面实际操作中使用到的一些并发控制语句:
•START TARNSACTION |BEGIN:显式地开启一个事务 。
•COMMIT:提交事务,使得对数据库做的所有修改成为永久性 。
•ROLLBACK 回滚会结束用户的事务,并撤销正在进行的所有未提交的修改 。
在下面我会使用 2 个命令行 MySQL ,模拟多线程(多事务) 。
脏读(读未提交)
一文带你轻松搞懂事务隔离级别

文章插图
 
避免脏读(读已提交)
一文带你轻松搞懂事务隔离级别

文章插图
 
不可重复读
还是刚才上面的读已提交的图,虽然避免了读未提交,但是却出现了,一个事务还没有结束,就发生了 不可重复读问题 。
一文带你轻松搞懂事务隔离级别

文章插图
 
可重复读
一文带你轻松搞懂事务隔离级别

文章插图
 
防止幻读(可重复读)
一文带你轻松搞懂事务隔离级别

文章插图
 
一个事务对数据库进行操作,这种操作的范围是数据库的全部行,然后第二个事务也在对这个数据库操作,这种操作可以是插入一行记录或删除一行记录,那么第一个是事务就会觉得自己出现了幻觉,怎么还有没有处理的记录呢? 或者 怎么多处理了一行记录呢?
幻读和不可重复读有些相似之处 ,但是不可重复读的重点是修改,幻读的重点在于新增或者删除 。




推荐阅读