文
章
目
录
章
目
录
Java面试题:说下mysql的事务隔离级别有哪些
得分点
未提交读、已提交读、可重复读、可串行化
标准回答
SQL标准定义了四种事务隔离级别,它们分别是:未提交读(READ UNCOMMITTED)、已提交读(READ COMMITTED)、可重复读(REPEATABLE READ)和可串行化(SERIALIZABLE)。这些隔离级别的目的是为了解决事务之间可能出现的脏读、不可重复读和幻读等问题。
下表展示了这四种隔离级别对这三个问题的解决程度:
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
READ UNCOMMITTED | 可能 | 可能 | 可能 |
READ COMMITTED | 不可能 | 可能 | 可能 |
REPEATABLE READ | 不可能 | 不可能 | 可能 |
SERIALIZABLE | 不可能 | 不可能 | 不可能 |
需要注意的是,MySQL支持这四种隔离级别,而InnoDB存储引擎默认的事务隔离级别是REPEATABLE READ。不过,与标准SQL不同的是,InnoDB在REPEATABLE READ隔离级别下使用了Next-Key Lock的锁算法,从而避免了幻读的产生。因此,InnoDB存储引擎在默认的事务隔离级别下已经能够完全保证事务的隔离性要求,达到了SQL标准的SERIALIZABLE隔离级别。
加分回答
- READ UNCOMMITTED:这个隔离级别性能最高,但也最不安全,因为它允许脏读。在这个级别下,事务可以读取其他事务尚未提交的数据,因此没有隔离效果,可以理解为没有隔离。
- SERIALIZABLE:在这个级别下,读操作会加共享锁,允许其他事务并发读,但不允许写。写操作会加排它锁,不允许其他事务并发读或写。这是最高的隔离级别,可以保证事务的完全隔离。
- REPEATABLE READ和READ COMMITTED:为了解决不可重复读问题,MySQL采用了MVCC(多版本并发控制)方式。每行记录可能有多个版本,每个版本都有一个表示版本的字段(如
row trx_id
),用于区分不同事务的修改。这样可以实现在同一时间点内不同事务读取不同版本的数据,从而避免了不可重复读问题。
这些隔离级别和MVCC机制是数据库系统中保障数据一致性和隔离性的重要组成部分。