【问题标题】:MongoDB transactions?MongoDB事务?
【发布时间】:2011-02-08 23:03:08
【问题描述】:

在 .NET 中使用 MongoDB 和 NoRM。

让我感到困惑的事情 - 没有交易
(不能只告诉MongoConnection.Begin/EndTransaction 或类似的东西)。

我想使用工作单元模式并回滚更改以防万一发生故障。

是否还有一种干净的方法可以使用 ITransaction 丰富我的存储库?

【问题讨论】:

    标签: .net transactions mongodb norm


    【解决方案1】:

    MongoDB 不支持复杂的多文档事务。如果这是你绝对需要的东西,它可能不适合你。

    但是,在大多数情况下,我们发现复杂的事务不是必需的。 MongoDB 中的所有操作都是对单个文档的原子操作,我们支持 nice update modifiers,这使得许多需要事务的操作易于实现(且速度快)。

    【讨论】:

    • 我没有得到update modifiers 部分。他们究竟能提供什么帮助? (请记住,我在这方面完全是新手):)
    • 更新修饰符允许您通过单个操作以原子方式执行某些复杂操作 - 类似于“将该字段的值增加 x”或“向该数组添加新值”。
    • @mdirolf 如果他遇到依赖 TRANSACTIONS 的场景,是否应该进行重构?
    • 这个答案已经过时了。 MongoDB 现在支持多文档 ACID 事务。 mongodb.com/blog/post/…
    【解决方案2】:

    确实,MongoDB 不支持开箱即用的事务,但您可以自己实现乐观事务。它们非常适合工作单元。我在GitHub 上写了一个 java 示例和一些解释,以便您可以轻松地在 C# 中重复。

    【讨论】:

    • 这是一个很好的例子。可惜它在 MongoDB 内部没有以这种方式实现,即使作为可切换的抽象/插件。
    • 如果你需要mongodb中的事务,你应该重新考虑你的软件设计/架构
    • 不再是真的了。 MongoDB 4.0 支持多文档 ACID 事务。
    【解决方案3】:

    从 v4.0 开始,MongoDB 支持多文档 ACID 事务。通过快照隔离,事务提供全局一致的数据视图,并强制执行全有或全无以保持数据完整性。欲了解更多信息,请参阅https://www.mongodb.com/transactions

    在 4.2 中,MongoDB 还将支持分片事务。

    在此blog post 中,我还概述了我们的多文档 ACID 交易之旅,以防您对历史和我们的推理感兴趣。

    【讨论】:

    【解决方案4】:

    MongoDB 4.0 将增加对多文档事务的支持。

    https://www.mongodb.com/transactions

    【讨论】:

    • 请不要只提供链接,而是将关键文本放入您的答案中。否则,如果链接断开,我们将失去答案! :)
    【解决方案5】:

    一些笔记记录。

    虽然MongoDB没有事务支持,但支持atomicity on a single document:

    MongoDB 确实支持单个文档中的原子操作。鉴于嵌套文档提供的可能性,此功能为大量用例提供支持。

    另外,关于“Isolate Sequence of Operations”的手动输入可能很有趣。例如:

    但是,您可以使用隔离运算符隔离影响多个文档的单个写入操作。

    【讨论】:

      【解决方案6】:

      您可以改用 MongoDb TokuMX。

      http://www.tokutek.com/products/tokumx-for-mongodb/

      TokuMXTM 是一个开源的高性能 MongoDB 发行版,与基本的 MongoDB 相比,它显着提高了性能和运营效率。 TokuMX 是 MongoDB 的直接替代品,性能提升 20 倍,数据库大小减少 90%,并支持 MVCC 的 ACID 事务。

      【讨论】:

        【解决方案7】:

        仅供参考 - 现在已经改变了

        using (var session = mongoDbContext.MongoDatabase.Client.StartSession())
                    {
                        var itemAuthRepo = (Repository<ItemAuthorization, ObjectId>)mongoDbContext.ItemAuthorizations;
                        var calendarRepo = (Repository<CalendarEvent, ObjectId>)mongoDbContext.Calendars;
        
                        if (itemAuthRepo != null && calendarRepo!=null)
                        {
                            session.StartTransaction();
        
                            try
                            {
                                itemAuthRepo.Collection.InsertOne(session, newItemAuthorization);
                                calendarRepo.Collection.InsertOne(session, cal);
                                session.CommitTransaction();
                            }
                            catch (Exception ex)
                            {
                                session.AbortTransaction();
                                throw;
                            }
                        }
                        else
                        {
                            throw new Exception("IRepository was not casted to Repository");
                        }
                    }
        

        【讨论】:

          【解决方案8】:

          是的,根据数据库版本,有多种方法可以为 MongoDB 应用工作单元模式。

          在 MongoDB 4.0 之前,不支持多文档 ACID 事务。然后开发人员使用“两阶段提交协议”(单数据库)和“三阶段提交协议”(分布式数据库上的非阻塞)创建自己的事务层,提供数据一致性但不 全有或全无执行以保持数据完整性。所以这种方式降低了性能。

          MongoDB 4.0 增加了对多文档 ACID 事务的支持。

          来源:

          https://en.wikipedia.org/wiki/Two-phase_commit_protocol

          https://en.wikipedia.org/wiki/Three-phase_commit_protocol

          https://www.mongodb.com/transactions

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-11-13
            • 2013-02-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多