c - 如何使用带有 FoundationDB 文档层的 MongoDB C 驱动程序进行事务?
问题描述
事务的 mongoc 文档使用会话。所以我尝试在与会话关联的事务中插入文档。但我得到了错误
[ 3666]: ERROR: mongoc: Failed to start session: Server does not support sessions
如何使用带有 FoundationDB 文档层的 MongoDB C 驱动程序进行事务?
我目前的代码是:
- (int)insertUser:(User *)user {
mongoc_client_session_t *session;
mongoc_session_opt_t *session_opts;
mongoc_transaction_opt_t *default_txn_opts;
mongoc_transaction_opt_t *txn_opts;
mongoc_read_concern_t *read_concern;
mongoc_write_concern_t *write_concern;
bson_t *doc;
bson_t *insert_opts;
bson_error_t err;
default_txn_opts = mongoc_transaction_opts_new();
read_concern = mongoc_read_concern_new();
mongoc_read_concern_set_level(read_concern, "snapshot");
mongoc_transaction_opts_set_read_concern(default_txn_opts, read_concern);
session_opts = mongoc_session_opts_new();
mongoc_session_opts_set_default_transaction_opts(session_opts, default_txn_opts);
session = mongoc_client_start_session(client, session_opts, &err);
if (!session) {
MONGOC_ERROR("Failed to start session: %s", err.message);
return EXIT_FAILURE;
}
txn_opts = mongoc_transaction_opts_new();
write_concern = mongoc_write_concern_new();
mongoc_write_concern_set_wmajority(write_concern, 1000); // write timeout
mongoc_transaction_opts_set_write_concern(txn_opts, write_concern);
}
int insertUserTransaction(id param, mongoc_client_session_t *session, mongoc_transaction_opt_t *txn_opts, User *user, bson_error_t *err) {
bool ret = mongoc_client_session_start_transaction(session, txn_opts, err);
if (!ret) {
MONGOC_ERROR("Failed to start transaction: %s", err->message);
return EXIT_FAILURE;
}
// ...
}
解决方案
文档层还不支持事务。它曾经通过一些不同于 MongoDB 构造的构造来公开 FoundationDB 事务。但是他们被禁用了一段时间。
推荐阅读
- bash - 打印基于分隔符的所有信息
- ios - 为什么我的物品在删除操作后会有一些横线?
- python-3.x - 在 Selenium 中保存数据
- angular - 支持 Angular 6+ 模板中的 Iterables
- protractor - 当我尝试运行多个 Spec 文件时,我们如何在配置文件中使用 On Prepare 功能
- r - 如何修复错误“下标越界”
- dji-sdk - 使用 Mavic 2 的 Mobile SDK iOS 应用程序需要使用什么语言?
- api - BigCommerce API - 按类别过滤所有品牌
- blockchain - web3j - 从签名交易中获取交易详情(金额、gas 价格、gas 限制)
- python-3.x - TypeError:必须是实数,而不是 MonthEnd