MongoDB已经更新到4.0版本,支持ACID及多文档事务。
在MongoDB中,单个文档的操作是原子的。在实际案例中,我们可以在单个文档中使用内嵌文档及数组,而不是在多个集合和文档中存储数据,这样可以省去了多文档事务的麻烦。
不管怎样,对于要求多文档更新原子性、读取一致性的情形,MongoDB提供了针对副本集执行多文档事务的能力。多文档事务可以跨多个操作、集合、数据库和文档使用。多文档事务中的操作,要么全部执行,要么全部不执行。事务提交后,其中的所有数据更改都会保存下来。如果任何操作失败,事务终止,事务中的数据变更会丢弃并且不再可见。在事务提交之前,事务外对事务中的写入操作不可见。
大多数情况下,多文档事务比单文档写入需要更多的性能开销,并且多文档事务不应该取代有效的数据结构设计(也就是说建议优先考虑合理的设计,而不是依赖多文档事务)。对于许多场景,非规范化的数据模型(内嵌文档和数组)对于我们的数据和用例还是最佳方案,适当的数据模型将减少对多文档事务的需求。
目前多文档事务只支持副本集,分片集群的事务支持计划在4.2版本实现。
多文档事务仅适用使用WiredTiger存储引擎的部署。
For transactions:
You can specify read/write (CRUD) operations on existing collections. The collections can be in different databases.
You cannot read/write to collections in the
config
,admin
, orlocal
databases.You cannot write to
system.*
collections.You cannot return the supported operation’s query plan (i.e.
explain
).For cursors created outside of transactions, you cannot call
getMore
inside a transaction.For cursors created in a transaction, you cannot call
getMore
outside the transaction.
多文档事务中不允许影响数据库目录的操作,如:创建、删除集合或索引。更多限制操作可以查看 受限操作.
The following mongo shell methods are available for transactions:
Spring Boot项目中关于MongoDB的事务支持 -> Spring Boot - 数据库操作之MongoDB