MST

星途 面试题库

面试题:PostgreSQL事务隔离级别如何影响数据一致性

请阐述PostgreSQL中不同事务隔离级别(读未提交、读已提交、可重复读、串行化)是怎样对数据一致性产生影响的,分别举例说明在每种隔离级别下可能出现的数据一致性问题。
33.6万 热度难度
数据库PostgreSQL

知识考点

AI 面试

面试题答案

一键面试

读未提交(Read Uncommitted)

  • 对数据一致性的影响:该级别允许事务读取其他事务尚未提交的数据。这是最低的隔离级别,它提供的一致性保障最少。它能提高并发性能,但可能导致数据的不一致。
  • 数据一致性问题举例 - 脏读(Dirty Read):假设事务A更新了一条数据,但尚未提交。此时事务B在“读未提交”隔离级别下读取到了事务A未提交的更新数据。如果事务A随后回滚,事务B读取到的数据就是无效的、“脏”的数据。例如,银行转账操作,事务A从账户A向账户B转账100元,在事务A未提交时,事务B查询账户B余额,发现多了100元,但如果事务A回滚,实际上账户B并未收到这100元,事务B读取到的就是脏数据。

读已提交(Read Committed)

  • 对数据一致性的影响:此级别保证一个事务只能读取到其他事务已经提交的数据。相较于“读未提交”,它提高了数据的一致性,但在并发场景下仍可能出现一些问题。
  • 数据一致性问题举例 - 不可重复读(Non - Repeatable Read):事务A在同一事务中两次读取同一数据。在两次读取之间,事务B更新并提交了该数据。那么事务A两次读取到的结果不一致。例如,事务A查询某商品价格为100元,事务B将该商品价格修改为120元并提交,事务A再次查询时,看到的价格变为120元,这就导致事务A在同一事务内对同一数据的读取结果不一致,即不可重复读。

可重复读(Repeatable Read)

  • 对数据一致性的影响:该级别确保在一个事务内多次读取同一数据时,得到的结果是一致的。它通过在事务开始时为所读取的数据加锁,防止其他事务对这些数据进行修改,进一步提高了数据一致性。
  • 数据一致性问题举例 - 幻读(Phantom Read):事务A按条件查询符合某些条件的一组数据,比如查询价格小于100元的商品列表。之后事务B插入了一条价格小于100元的新商品记录并提交。事务A再次按相同条件查询时,发现多了一条记录,就好像产生了“幻影”一样。虽然事务A对已读取的数据能保证一致性,但对于新插入的数据(幻像数据)无法避免这种不一致情况。

串行化(Serializable)

  • 对数据一致性的影响:这是最高的隔离级别,它通过强制事务串行执行,避免了所有并发问题,保证了数据的强一致性。但由于事务只能依次执行,并发性能最低。
  • 数据一致性问题举例 - 无:在串行化隔离级别下,不存在脏读、不可重复读、幻读等数据一致性问题。因为事务是串行执行的,一个事务执行完另一个事务才能开始,不存在并发访问导致的数据不一致情况。例如,多个事务对商品库存的操作,都是依次执行,不会出现数据冲突和不一致。