MST

星途 面试题库

面试题:分布式系统中数据库隔离性与ACID原则 - 事务隔离级别

在分布式系统环境下,简述数据库常见的事务隔离级别(读未提交、读已提交、可重复读、串行化)各自的特点及可能产生的并发问题,并举例说明如何在实际场景中选择合适的隔离级别。
19.3万 热度难度
后端开发分布式系统

知识考点

AI 面试

面试题答案

一键面试

读未提交(Read Uncommitted)

  • 特点:事务可以读取其他事务尚未提交的数据。这是最低的隔离级别,几乎没有隔离措施。
  • 并发问题
    • 脏读(Dirty Read):一个事务读取到另一个事务未提交的数据。例如事务A修改了数据但未提交,事务B此时读取到了修改后的数据,若事务A回滚,事务B读取到的数据就是无效的脏数据。
  • 适用场景:在对数据一致性要求不高,且追求最大并发性能的场景下,如某些日志记录系统,只关心最新的数据,即使是未提交的也可接受。

读已提交(Read Committed)

  • 特点:一个事务只能读取其他事务已经提交的数据。在大多数主流数据库中,这是默认的隔离级别。
  • 并发问题
    • 不可重复读(Non - Repeatable Read):在一个事务内,多次读取同一数据,由于其他事务提交修改,导致每次读取结果不一致。例如事务A读取数据后,事务B修改并提交了该数据,事务A再次读取时,得到的是不同的值。
    • 幻读(Phantom Read):在一个事务内,按照相同条件多次查询,由于其他事务插入新数据,导致每次查询的结果集数量不一致。
  • 适用场景:适用于大多数业务场景,例如银行账户查询,用户每次查询账户余额时,希望看到的是已经确定提交的金额变动,避免脏读。

可重复读(Repeatable Read)

  • 特点:在一个事务内,多次读取同一数据,其结果始终保持一致,不受其他事务提交修改的影响。
  • 并发问题
    • 幻读(Phantom Read):虽然能解决不可重复读问题,但对于新插入的数据(幻读情况)依然无法处理。例如事务A按条件查询数据,事务B插入满足该条件的新数据并提交,事务A再次按相同条件查询,会发现结果集多了新数据。
  • 适用场景:适用于需要保证数据一致性和重复读取结果稳定性的场景,如财务核算场景,在核算期间,不希望数据因其他事务的修改而发生变化。

串行化(Serializable)

  • 特点:最高的隔离级别,事务串行执行,完全避免了并发问题。
  • 并发问题:几乎不存在并发问题,因为所有事务依次执行,不存在并发操作。
  • 适用场景:适用于对数据一致性要求极高,且并发量较小的场景,如涉及资金交易、关键数据修改等不容许出现任何数据不一致的场景。但由于其对并发性能影响较大,会导致系统吞吐量降低,所以一般谨慎使用。