MySQL 中的事务隔离级别有哪些?
MySQL 中的事务隔离级别有哪些?
回答重点
在 MySQL 中,事务隔离级别主要有以下四种:
1)读未提交(READ UNCOMMITTED):
- 这是最低的隔离级别,在该级别下,一个事务可以看到另一个事务尚未提交的数据修改。这可能会导致脏读问题,即读取到其他事务未提交的数据。
2)读已提交(READ COMMITTED):
- 在这个级别下,一个事务只能看到已经提交的其他事务所做的修改。这可以避免脏读问题,但是可能会引发不可重复读问题,即在同一个事务中,相同的查询可能返回不同的结果。
3)可重复读(REPEATABLE READ):
- 在这个级别下,确保在一个事务中的多个查询返回的结果是一致的。这可以避免不可重复读问题,但是可能会引发幻读问题,即在同一个事务中,多次查询可能返回不同数量的行(MySQL 默认的隔离级别)。
4)串行化(SERIALIZABLE):
- 并发 SQL 事务在 SERIALIZABLE 隔离级别下的执行被保证是可串行化的。可串行化执行被定义为:并发执行的 SQL 事务的操作,其效果与这些 SQL 事务按某种顺序串行执行的效果相同。串行执行是指每个 SQL 事务在下一个 SQL 事务开始之前完成其全部操作 来源 SQL92定义 。
- 这是最高的隔离级别,在这个级别下,保证事务间的操作结果相当于一个按顺序执行的单线程操作。这可以避免所有的并发问题,但是会大大降低并发性能。
扩展知识
隔离级别的影响
较低的隔离级别(如读未提交)提高了并发性,但可能导致数据不一致;较高的隔离级别(如串行化)保证数据一致性,但降低了并发性。因此,在设计应用时,需要在性能和数据一致性之间找到平衡。
一般互联网大厂会选择读已提交隔离级别。
脏读、不可重复读、幻读的概念
补充说明 MySQL 的串行化(SERIALIZABLE)
根据官网所述 ,MySQL 的 SERIALIZABLE 级别类似于 REPEATABLE READ。但是如果关闭了自动提交事务,那么 SERIALIZABLE 级别下的普通 SELECT 会被隐式转成 SELECT ... FOR SHARE,即对读加共享锁确保其他事务无法修改正在读取的数据,实现了读的一致性。
这个操作就避免了REPEATABLE READ隔离级别下由于快照读和当前读混用形成的幻读问题 。
Comments