I'm working with mongodb transactions in c++. The steps I’m performing are the following:
This is the code snippet for the algorithm:
#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;
}
which you can compile using the following command in a linux system with mongocxx installed:
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
While executing I get the following error:
Total size of all transaction operations must be less than 16793600. Actual size is 16793810: generic server error
But I'm only inserting 100k docs.
What could be generating the error?
The transaction size refers to the size of the data in bytes, not the number of documents. It's a 16 MB limit. If your transaction size exceeds this 16 MB limit, you will receive this error.