如何在Mongo中实现事务回滚?

15

我正在使用mongoose代替mongodb。

在nodejs express服务器的请求和响应中,通常需要通过mongoose对mongodb进行多个查询。

在许多情况下,可能会出现前几个查询成功执行,其余查询在事务下全部失败的情况。

现在我需要将我的数据库状态回滚到最初状态。

那么在mongodb中如何高效地回滚呢? 请提供一些适当的参考。


如果你想要适应MongoDB的功能,"补偿"事务通常是一个有用的选项。在这种情况下,它会"撤销"所做出的任何更改。 - WiredPrairie
查询不会改变文档。您想要回滚什么? - Asya Kamsky
3个回答

5

我同意Hector的观点。如果您需要进行多个文档交易,那么Mongo可能不适合您。您能否将数据结构嵌入到单个文档中?那么您就可以获得所需的回滚操作。

另一个选择是查看Mongo克隆TokuMX,它提供跨多个文档的事务处理。


3
TokuMX的事务功能与分片不兼容。 - Asya Kamsky
自 MongoDB 4.0.0(和 Mongoose 5.2.0)起,MongoDB 现在支持事务操作。请参见 https://mongoosejs.com/docs/transactions.html - João Otero

4

1

无论您在MongoDB上加什么,它都不支持传统的ACID数据库事务。这不是Mongoose或Express.js的问题,而是MongoDB的特性。

MongoDB支持原子操作,这意味着保存到集合的操作要么完全成功,要么失败,换句话说,您不会得到对集合中单个文档的部分更新。但是MongoDB不支持单个事务中的多个更新。

http://docs.mongodb.org/manual/faq/fundamentals/#does-mongodb-support-transactions


有没有办法管理这些多个查询事务的回滚? - codeofnode
1
如果你真的需要这个功能,我建议你重新考虑一下是否MongoDB是你项目的正确选择。也许你应该使用一个传统的关系型数据库,它可以直接支持这个功能。 - Hector Correa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接