关于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和写操作中数据的预期状态。