mongo原子性和事务

关于mongodb原子性和事务的说明,大部分翻译自官方文档(https://docs.mongodb.com/manual/tutorial)

原子性和事务

在MongoDb中,写操作在文档级别是原子性的,即使该文档包含多个嵌入的子文档。

当一次写操作修改多个文档时,对每个文档的更新时原子性的,但整个写入操作不是原子性的,而且中间可能会插入多个其他操作。

模拟事务

因为一个文档可以包含多个子文档,所以文档级别的原子性可以满足大部分的应用场景。如果你想把多个操作作为一个事务来处理,你可以实现一个two-phase commit

然而,two-phase commit仅仅可以提供类事务语义。使用它可以保证数据的一致性,但是在two-phase commit或回滚进行时可能会返回中间数据。关于two-phase commit的更多信息,请看这里 Perform Two Phase Commits

并发控制 Concurrency Control

并发控制可以保证多个应用运行时的一致性,避免导致数据不一致或数据冲突问题。

方法一是在一个有唯一数据值的字段上创建一个唯一索引unique index。这样可以防止插入或更新产生重复数据。在多个字段上创建唯一索引,来保证这多个字段组合值的唯一性。示例操作请看,update() and Unique Index, findAndModify() and Unique Index

方法二是,在查询条件上对指定字段的当前值进行判断。在写操作中,two-phase commit模式提供了一个变量,其中的查询条件包含了应用标识application identifier和写操作中数据的预期状态。