You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用mongoc驱动执行MongoDB事务时未阻塞其他操作的原因咨询

MongoDB事务循环插入未阻塞其他操作的原因解析

问题描述

我通过mongoc驱动实现了MongoDB事务,在事务回调中循环插入1000条文档,整个过程耗时约5秒,但期间执行其他插入、更新、创建索引操作时并未被阻塞。我了解MongoDB的意向锁、共享锁、排他锁机制,原本认为单文档插入的事务应该会获取数据库和集合的意向排他锁(IX)以及文档的排他锁(X),但实际现象与预期不符,已通过测试代码、db.currentOp()等方式验证该现象。

代码实现

bool
create_and_insert_doc (mongoc_client_session_t *session,
                       void *ctx,
                       bson_t **reply, /* out param for our server reply */
                       bson_error_t *error)
{
   /*
    * mongoc_collection_insert_one requires an uninitialized, stack-allocated
    * bson_t to receive the update result
    */
   bson_t local_reply;
   bson_t *doc = NULL;
   ctx_t *data = NULL;
   bool retval;


   for (int i = 0; i < 1000; i++) {
      doc = BCON_NEW ("new", BCON_INT32 (2), "val", BCON_INT32 (2));
      printf ("Running the user-defined callback in a newly created transaction...\n");
      data = (ctx_t *) ctx;
      retval = mongoc_collection_insert_one (data->collection, doc, data->insert_opts, &local_reply, error);
      {
         sleep(0.5);
      }  
   }
   printf ("sleep end...\n");
   /*
    * To return to the mongoc_client_session_with_transaction() method, set
    * *reply to a new copy of our local_reply before destroying it.
    */
   *reply = bson_copy (&local_reply);
   bson_destroy (&local_reply);

   bson_destroy (doc);
   return retval;
}

mongoc_client_session_with_transaction (session, &create_and_insert_doc, NULL, &ctx, &reply, &error);

核心原因分析

  • 意向锁的兼容性特性:事务确实会获取数据库和集合的意向排他锁(IX),但IX锁的设计目的是声明“将在更低粒度(文档级)加排他锁”,它不会阻塞其他事务的IX锁、IS锁(意向共享锁)或S锁(共享锁)。多个事务可以同时持有同一集合的IX锁,这是其他插入/更新操作不被阻塞的核心原因。
  • 文档级锁的粒度隔离:每个插入操作针对的是全新文档(MongoDB自动生成唯一_id),事务只会为每个新文档获取文档级排他锁(X),这些锁针对不同文档,互相之间没有冲突,因此其他事务操作不同文档时完全不受影响。
  • 索引操作的锁兼容性:
    • 后台创建索引(默认行为)会获取集合的IS锁,与IX锁完全兼容;
    • 前台创建索引会获取集合的S锁,根据MongoDB锁兼容性规则,S锁与IX锁也是兼容的,因此不会被事务的IX锁阻塞。
  • 事务锁的按需持有:事务中的锁是按需获取的,仅在操作文档时获取对应锁,且不同文档的锁之间无冲突,不会造成跨操作的阻塞。

内容的提问来源于stack exchange,提问作者Insub

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 02:34:58