首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用事务时MongoDB错误:所有事务操作的总大小必须小于16793600。实际大小为16793810:一般服务器错误

使用事务时MongoDB错误:所有事务操作的总大小必须小于16793600。实际大小为16793810:一般服务器错误
EN

Stack Overflow用户
提问于 2019-08-07 22:16:48
回答 2查看 1.7K关注 0票数 1

我正在c++中处理mongodb事务。我正在执行的步骤如下:

  1. 创建会话
  2. 为此会话创建一个bulk_write,其中包含对集合的多个插入
  3. 启动事务
  4. 执行bulk_write
  5. 提交事务

这是算法的代码片段:

代码语言:javascript
运行
复制
#include <iostream>
#include <vector>

#include <bsoncxx/builder/stream/document.hpp>
#include <bsoncxx/json.hpp>
#include <bsoncxx/exception/exception.hpp>
#include <mongocxx/client.hpp>
#include <mongocxx/instance.hpp>
#include <mongocxx/exception/exception.hpp>
#include <mongocxx/exception/logic_error.hpp>
#include <mongocxx/exception/operation_exception.hpp>


int main(int argc, char** argv)
{
    /* Parameters */

    std::string db_uri = "<PROVIDE URI TO CONNECT WITH A MONGO DB WITH REPLICA SETS>";
    std::string db_name = "db_0";
    std::string collection0_name = "coll_0";
    int N_INSERTS = 100000;

    /* Init connection */

    static mongocxx::instance inst{};
    mongocxx::uri client_uri = mongocxx::uri(db_uri);
    mongocxx::options::client client_options;
    mongocxx::options::ssl ssl_options;
    ssl_options.allow_invalid_certificates(true);
    client_options.ssl_opts(ssl_options);
    mongocxx::client client = mongocxx::client(client_uri, client_options);

    /* Reinit collection */

    mongocxx::database db = client[db_name];        
    auto builder = bsoncxx::builder::stream::document{};
    bsoncxx::document::value doc_value = builder
    << "Hello" << "MongoDB"
    << bsoncxx::builder::stream::finalize;    
    db[collection0_name].insert_one(doc_value.view()); /* insert a dummy doc */    
    db[collection0_name].delete_many({}); /* delete all docs */

    /* Create session */

    mongocxx::client_session session = client.start_session();

    /* Start transaction */

    session.start_transaction();

    /* Create bulk operations */

    mongocxx::bulk_write op0 = db[collection0_name].create_bulk_write(session);

    /* Fill insert bulk operations */

    for (int i = 0; i < N_INSERTS; i++){

        mongocxx::model::insert_one insert_one{
            bsoncxx::builder::basic::make_document(
                bsoncxx::builder::basic::kvp("field0", i),
                bsoncxx::builder::basic::kvp("field1", i),
                bsoncxx::builder::basic::kvp("field2", i)
            )
        };

        op0.append(insert_one);
    }

    /* Execute transaction */

    try {
        bulk_op->execute();
    }
    catch (std::exception& e){     
        std::cerr << "Bulk write exception: " << e.what() << std::endl;
        session.abort_transaction();
    }    

    session.commit_transaction();   

    return 0;
}

可以在安装了mongocxx的linux系统中使用以下命令进行编译:

代码语言:javascript
运行
复制
c++ --std=c++11 test.cpp -o test -I/usr/local/include/mongocxx/v_noabi -I/usr/local/include/bsoncxx/v_noabi -L/usr/local/lib -lmongocxx -lbsoncxx

在执行时,我会得到以下错误:

代码语言:javascript
运行
复制
Total size of all transaction operations must be less than 16793600. Actual size is 16793810: generic server error

但我只插入了100000个文档。

是什么导致了错误?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-07 22:24:22

事务大小指的是以字节为单位的数据大小,而不是文档数量。这是16 MB的限制。如果您的事务大小超过了这16 MB的限制,您将收到此错误。

票数 6
EN

Stack Overflow用户

发布于 2020-07-26 06:39:06

MongoDB4.2版本的事务比以前的版本更大。最近我遇到了同样的问题,我通过升级mongodb来解决这个问题。

https://jira.mongodb.org/browse/SERVER-36330

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57402919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档