事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交 (READ-UNCOMMITTED) | 可能 | 可能 | 可能 |
不可重复读/读提交(READ-COMMITTED) | 不可能 | 可能 | 可能 |
可重复读(REPEATABLE-READ) | 不可能 | 不可能 | 可能 |
串行化 (SERIALIZABLE) | 不可能 | 不可能 | 不可能 |
这四种级别由上至下,隔离强度逐渐增强,性能逐渐变差。它们没有绝对的优劣,采取哪种应该根据系统需求决定。MySQL默认级别为:可重复读。
串行化是4种事务隔离级别中隔离效果最好的,解决了脏读、可重复读、幻读的问题,但是效果最差,它将事务的执行变为顺序执行,与其他三个隔离级别相比,它就相当于单线程,后一个事务的执行必须等待前一个事务结束。
MySQL在其默认隔离级别即可重复读状态下已经解决了幻读问题。
不要混淆幻读与不可重复读,两者极其相似。但是前者针对INSERT操作,后者针对UPDATE操作。
select @@transaction_isolation;
# 或者使用模糊查询,查询变量
show variables like '%_isolation%';
set session transaction isolation level read uncommitted;
# session为事务隔离级别的范围,即当前会话。
# 与之对应的还有global,即全局范围。global设置的范围只对新的session窗口有效,修改之前已经开启的会话不受影响。
# read uncommitted为设置的隔离级别——读未提交。
# 开启事务
start transaction;
# 事务回滚
rollback;
# 事务提交
commit;
Q.E.D.