MST

星途 面试题库

面试题:分布式系统中,NoSQL数据库在部分场景下如何尽量满足ACID特性

在分布式系统里,我们知道NoSQL数据库通常不严格遵循ACID特性。但在某些对数据一致性和可靠性要求较高的场景中,需要尽量满足ACID特性。请举例说明一种NoSQL数据库(如MongoDB或Cassandra),并阐述它在特定场景下是如何通过一些机制尽量去满足ACID特性的?
39.4万 热度难度
后端开发分布式系统

知识考点

AI 面试

面试题答案

一键面试

以MongoDB为例:

  • 原子性(Atomicity):从MongoDB 4.0开始支持多文档事务,在一个事务中的所有操作,要么全部成功,要么全部失败回滚。例如在一个电商场景中,订单创建时,要同时更新库存和用户账户余额,这些操作可放在一个事务里,保证原子性。
  • 一致性(Consistency)
    • 写操作:通过设置写关注(write concern),可确保写入的数据符合数据模型约束且复制到指定数量的副本集成员。比如设置 w: "majority",只有当大多数副本集成员确认写入成功,才认为写操作成功,保证了数据一致性。
    • 读操作:通过设置读偏好(read preference),如选择 primaryPreferredprimary,从主节点读取数据,确保读取到最新已提交的数据,维持一致性。在金融交易记录场景中,保证读取到的数据是最新且准确的。
  • 隔离性(Isolation):MongoDB事务默认采用快照隔离(Snapshot Isolation)。在事务开始时,创建数据的一个快照,事务中的读操作基于这个快照,写操作在事务提交时才会对其他事务可见。这就像多个并发事务各自在自己的“小世界”里操作数据,避免了脏读、不可重复读等问题。
  • 持久性(Durability):写操作配合 j: true(启用日志记录)选项,将数据写入操作记录到WiredTiger存储引擎的预写式日志(WAL)中。即使系统崩溃,重启后可通过重放WAL日志恢复未持久化的数据,保证了数据的持久性。例如在记录重要的业务日志场景中,确保日志不会丢失。