准备命令:
//查看隔离级别
select @@global.tx_isolation, @@tx_isolation;
//修改当前会话隔离级别
set session tx_isolation='read-uncommitted';
set session tx_isolation='read-committed';
set session tx_isolation='repeatable-read';
Read Uncommitted
在两个会话执行如下操作,
会话一:未提交
会话二:可以看到未提交的结果
Read Committed
修改会话隔离级别如上(略)
会话一:第一步,开启事务,查询数据
会话二:第一步,开启事务,更新数据,但不提交
会话一:第二步,在同一事务下,再次执行查询,看不到会话二未提交的数据
当会话二提交后,会话一方可看到修改后的结果。
但会出现"不可重复读",如下:
会话一:开启事务,先执行第一次查询
会话二:开启事务,执行update操作并提交
会话一:保持之前开启的事务,执行第二次查询,和第一次的结果不一样,查询到了中间会话二提交的内容(行级锁,不锁间隙)
Repeatable Read(可重读)
解决"可重复读"
会话一:开启事务,先执行第一次查询
会话二:开启事务,执行update操作并提交
会话一:保持之前开启的事务,执行第二次查询,和第一次的结果一样,查询不到中间会话二提交的内容(行级锁且是锁间隙)
如下:
幻读:指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。
InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。
Serializable(可串行化)