MongoDB-CN-Manual
  • MongoDB中文手册|官方文档中文版
  • MongoDB用户手册说明
  • MongoDB简介
    • 入门
    • 数据库和集合
      • 视图
      • 按需物化视图
      • 封顶集合
      • 时间序列集合
    • 文档
    • BSON类型
      • Comparison and Sort Order
      • MongoDB Extended JSON (v2)
      • MongoDB Extended JSON (v1)
  • 安装 MongoDB
    • 安装MongoDB社区版
      • 在Linux上安装MongoDB社区版
      • 在macOS上安装MongoDB社区版
      • 在Windows上安装MongoDB社区版
    • 安装MongoDB企业版
      • 在Linux上安装MongoDB企业版
      • 在Mac OS安装MongoDB企业版
      • 在Windows安装MongoDB企业版
      • 使用Docker安装MongoDB企业版
    • 将社区版MongoDB升级到企业版MongoDB
    • 验证MongoDB软件包的完整性
  • The mongo Shell
    • 配置mongo Shell
    • 使用 mongo Shell帮助
    • 为mongo Shell编写脚本
    • mongo Shell中的数据类型
    • mongo Shell 快速参考
  • MongoDB CRUD操作
    • 插入文档
      • 插入方法
    • 查询文档
      • 在mongo Shell中迭代游标
      • 从查询返回的项目字段
      • 查询嵌入式文档数组
      • 查询数组
      • 查询空字段或缺少字段
      • 查询嵌入/嵌套文档
    • 更新文档
      • 更新方法
      • 聚合管道更新
    • 删除文档
      • 删除方法
    • 地理空间查询
      • 用地理空间查询查找餐馆
      • GeoJSON对象
    • 批量写入操作
    • 可重试写入
    • 可重试读取
    • SQL到MongoDB的映射图表
    • 文本搜索
      • 文本索引
      • 文本索引操作
      • 集合管道中的文本索引
      • 文本索引语言
    • Read Concern读关注
      • 读关注 "local"
      • 读关注 "available"
      • 读关注 "majority"
      • 读关注 "linearizable"
      • 读关注 "snapshot"
    • Write Concern写关注
    • MongoDB CRUD概念
      • 原子性和事务
      • 读隔离性,一致性和近因性
        • 因果一致性和读写关注
      • 分布式查询
      • 通过findAndModify进行线性化读取
      • 查询计划
      • 查询优化
        • 评估当前操作性能
        • 优化查询性能
        • 写操作性能
        • 说明结果
      • 分析查询表现
      • Tailable 游标
  • MongoDB聚合
    • 聚合管道
      • 聚合管道优化
      • 聚合管道限制
      • 聚合管道和分片集合
      • 使用 Zip Code 数据集进行聚合
      • 使用用户首选项数据进行聚合
    • Map-Reduce
      • Map-Reduce 和分片集合
      • Map-Reduce 并发
      • Map-Reduce 示例
      • 执行增量 Map-Reduce
      • 对 Map Function 进行故障排除
      • 排除 Reduce Function 问题
      • Map-Reduce转换到聚合管道
    • 聚合参考
      • 聚合管道快速参考
      • 聚合命令
      • 聚合命令对比
      • 聚合表达式中的变量
      • SQL 到聚合映射图表
  • MongoDB数据模型
    • 数据建模介绍
    • 模式验证
    • 数据模型设计
      • 一对一嵌套关系模型
  • MongoDB事务
  • MongoDB事务
    • 驱动程序 API
    • 生产注意事项
    • 生产注意事项 (分片集群)
    • 事务操作
  • MongoDB索引
    • 单字段索引
    • 复合索引
    • 多键索引
      • 多键索引范围
    • 文本索引
      • 为文本索引指定语言
      • 指定文本索引的名称
      • 用权重控制搜索结果
      • 限制扫描条目的数量
    • 通配符索引
      • 通配符索引限制
    • 2dsphere 索引
      • 查询一个2dsphere索引
    • 2d 索引
      • 创建一个2d索引
      • 查询一个2d索引
      • 2d索引内部
      • 使用球面几何计算距离
    • geoHaystack 索引
      • 创建Haystack索引
      • 查询Haystack索引
    • 哈希索引
    • 索引特性
      • TTL 索引
        • 通过设置TTL使集合中的数据过期
      • 唯一索引
      • 部分索引
      • 不分大小写索引
      • Sparse 索引
    • 在填充的集合上建立索引
      • 在副本集上建立滚动索引
      • 在分片群集上建立滚动索引
    • 索引交集
    • 管理索引
    • 衡量索引使用
    • 索引策略
      • 创建索引来支持查询
      • 使用索引对查询结果进行排序
      • 确保索引适合RAM
      • 创建以确保选择性的查询
    • 索引参考
  • MongoDB安全
    • 安全检查列表
    • 启用访问控制
    • 身份验证
      • 用户
        • 添加用户
        • 权限认证机制
          • SCRAM
            • 用x.509证书来认证客户端
    • 审计
      • 配置审计过滤器
      • 配置审计
      • 系统事件审计消息
    • 网络和配置强化
    • 安全参考
      • system.roles集合
      • system.users集合
      • 资源文档
      • 权限操作
    • 附录
      • 附录-A-用于测试的 OpenSSl CA 证书
      • 附录-B-用于测试的OpenSSL服务器证书
      • 附录-C-用于测试的OpenSSL客户端证书
  • Change Streams变更流
    • 变更流生产建议
    • 变更事件
  • MongoDB复制
    • 副本集成员
    • 副本集日志
    • 副本集数据同步
    • 副本集部署架构
    • 副本集成员配置教程
    • 副本集维护教程
    • MongoDB复制参考
  • MongoDB分片
    • 分片集群组件
    • 分片键
    • 哈希分片
    • 范围分片
    • 区
      • 管理分片区
      • 按位置细分数据
      • 用于更改SLA或SLO的分层硬件
      • 按应用或客户细分数据
      • 仅插入工作负载的分布式本地写入
      • 管理分片区
    • 使用块进行数据分区
      • 在分片集群中拆分数据块
    • 分片管理
      • 查看集群设置
    • 重启一个分片集群
    • [把一个分片集群迁移到不同的硬件](fen-pian/migrate-a -sharded-cluster-to-different-hardware.md)
    • 分片参考
  • MongoDB管理
    • 产品说明
    • 操作检查列表
    • 开发检查列表
    • 配置和维护
    • 性能
    • 数据中心意识
      • MongoDB部署中的工作负载隔离
      • 区
        • 管理分片区
        • 按位置细分数据
        • 用于更改SLA或SLO的分层硬件
        • 按应用或客户细分数据
        • 仅插入工作负载的分布式本地写入
        • 管理分片区
    • MongoDB备份方法
    • MongoDB监控
  • MongoDB存储
    • 存储引擎
      • WiredTiger 存储引擎
      • 内存存储引擎
    • 日志记录
      • 管理日志记录
        • GridFS
        • FAQ:MongoDB 存储
  • MongoDB参考
    • 运算符
      • 查询与映射运算符
        • 比较查询运算符
          • $eq
          • $gt
          • $gte
          • $in
          • $lt
          • $lte
          • $ne
          • $nin
        • 逻辑查询运算符
          • $and
          • $not
          • $nor
          • $or
        • 元素查询运算符
        • 评估查询运算符
        • 地理空间查询运算符
        • 数组查询运算符
        • 按位查询运算符
        • $comment
        • 映射运算符
      • 更新运算符
        • 字段更新运算符
        • 数组更新运算符
        • 按位更新运算符
      • 聚合管道阶段
      • 聚合管道操作符
        • $abs (aggregation)
        • $acos (aggregation)
        • $acosh (aggregation)
        • $add (aggregation)
        • $addToSet (aggregation)
        • $allElementsTrue (aggregation)
        • $and (aggregation)
        • $anyElementTrue (aggregation)
        • $arrayElemAt (aggregation)
        • $arrayToObject (aggregation)
        • $asin (aggregation)
        • $asinh (aggregation)
        • $atan (aggregation)
        • $atan2 (aggregation)
        • $atanh (aggregation)
        • $avg (aggregation)
        • $ceil (aggregation)
        • $cmp (aggregation)
        • $concat (aggregation)
        • $concatArrays (aggregation)
        • $cond (aggregation)
        • $convert (aggregation)
        • $cos (aggregation)
        • $dateFromParts (aggregation)
        • $dateToParts (aggregation)
        • $dateFromString (aggregation)
        • $literal (aggregation)
      • 查询修饰符
    • 数据库命令
      • 聚合命令
      • 地理空间命令
      • 查询和写操作命令
      • 查询计划缓存命令
      • 认证命令
      • 用户管理命令
      • 角色管理命令
      • 复制命令
      • 分片命令
      • 会话命令
      • 管理命令
      • 诊断命令
      • 免费监控命令
      • 系统事件审计命令
    • mongo Shell 方法
      • 集合方法
        • db.collection.aggregate()
        • db.collection.bulkWrite()
        • db.collection.copyTo()
        • db.collection.count()
        • db.collection.countDocuments()
        • db.collection.estimatedDocumentCount()
        • db.collection.createIndex()
        • db.collection.createIndexes()
        • db.collection.dataSize()
        • db.collection.deleteOne()
        • db.collection.deleteMany()
        • db.collection.distinct()
        • db.collection.drop()
        • db.collection.dropIndex()
        • db.collection.dropIndexes()
        • db.collection.ensureIndex()
        • db.collection.explain()
        • db.collection.find()
        • db.collection.findAndModify()
        • db.collection.findOne()
        • db.collection.findOneAndDelete()
        • db.collection.findOneAndReplace()
        • db.collection.findOneAndUpdate()
        • db.collection.getIndexes()
        • db.collection.getShardDistribution()
        • db.collection.getShardVersion()
        • db.collection.insert()
        • db.collection.insertOne()
        • db.collection.insertMany()
        • db.collection.isCapped()
        • db.collection.latencyStats()
        • db.collection.mapReduce()
        • db.collection.reIndex()
        • db.collection.remove()
        • db.collection.renameCollection()
        • db.collection.replaceOne()
        • db.collection.save()
        • db.collection.stats()
        • db.collection.storageSize()
        • db.collection.totalIndexSize()
        • db.collection.totalSize()
        • db.collection.update()
        • db.collection.updateOne()
        • db.collection.updateMany()
        • db.collection.watch()
        • db.collection.validate()
    • MongoDB中的限制与阈值
    • MongoDB系统集合
    • 词汇表
    • 默认的MongoDB端口
    • 默认的MongoDB读/写关注
    • 服务器会话
  • MongoDB FAQ
    • FAQ: MongoDB基础知识
    • FAQ: MongoDB索引
    • FAQ: MongoDB并发
    • FAQ: MongoDB分片
    • FAQ: MongoDB复制和副本集
    • FAQ: MongoDB存储
    • FAQ: MongoDB诊断
  • MongoDB 版本管理
  • 联系我们
    • Tapdata Cloud
    • MongoDB中文社区
    • 社区合作伙伴—锦木信息
由 GitBook 提供支持
在本页
  • 事务
  • 事务API
  • 事务和原子性
  • 事务和操作
  • 事务和会话
  • 读关注/写关注/读偏好
  • 通用信息
  • 附加事务主题

MongoDB事务

上一页一对一嵌套关系模型下一页MongoDB事务

最后更新于3年前

事务

在MongoDB中,对单个文档的操作是原子的。由于可以在单个文档结构中使用内嵌文档和数组来获得数据之间的关系,而不必跨多个文档和集合进行范式化,所以这种单文档原子性避免了许多实际场景中对多文档事务的需求。

对于那些需要对多个文档(在单个或多个集合中)进行原子性读写的场景,MongoDB支持多文档事务。而使用分布式事务,事务可以跨多个操作、集合、数据库、文档和分片使用。

事务API


➤ 使用右上角的Select your language下拉菜单来设置以下示例的语言。


此示例突出显示了事务API的关键组件。

该示例使用新的回调API来进行事务处理,其中涉及启动事务、执行指定的操作并提交(或在出错时中止)。新的回调API还包含针对TransientTransactionError或UnknownTransactionCommitResult提交错误的重试逻辑。

重要

  • 推荐。使用针对MongoDB部署版本更新的MongoDB驱动程序。对于MongoDB 4.2部署(副本集和分片集群上的事务,客户端必须使用为MongoDB 4.2更新的MongoDB驱动程序。

  • 使用驱动程序时,事务中的每个操作必须与会话相关联(即将会话传递给每个操作)。

  • 事务中的操作使用,[事务级写关注](https ://docs.mongodb.com/manual/core/transactions/#std-label-transactions-write-concern)和。

  • 在MongoDB 4.2及更早版本中,你无法在事务中创建集合。如果在事务内部运行会导致文档插入的写操作(例如insert或带有upsert: true的更新操作),必须在已存在的集合上才能执行。

  • 从MongoDB 4.4开始,你可以隐式或显式地在事务中创建集合。但是,必须使用针对4.4更新的MongoDB驱动程序。有关详细信息,请参阅。

static bool
with_transaction_example (bson_error_t *error)
{
   mongoc_client_t *client = NULL;
   mongoc_write_concern_t *wc = NULL;
   mongoc_read_concern_t *rc = NULL;
   mongoc_read_prefs_t *rp = NULL;
   mongoc_collection_t *coll = NULL;
   bool success = false;
   bool ret = false;
   bson_t *doc = NULL;
   bson_t *insert_opts = NULL;
   mongoc_client_session_t *session = NULL;
   mongoc_transaction_opt_t *txn_opts = NULL;

   /* For a replica set, include the replica set name and a seedlist of the
    * members in the URI string; e.g.
    * uri_repl = "mongodb://mongodb0.example.com:27017,mongodb1.example.com:" \
    *    "27017/?replicaSet=myRepl";
    * client = test_framework_client_new (uri_repl);
    * For a sharded cluster, connect to the mongos instances; e.g.
    * uri_sharded =
    * "mongodb://mongos0.example.com:27017,mongos1.example.com:27017/";
    * client = test_framework_client_new (uri_sharded);
    */

   client = get_client ();

   /* Prereq: Create collections. */
   wc = mongoc_write_concern_new ();
   mongoc_write_concern_set_wmajority (wc, 1000);
   insert_opts = bson_new ();
   mongoc_write_concern_append (wc, insert_opts);
   coll = mongoc_client_get_collection (client, "mydb1", "foo");
   doc = BCON_NEW ("abc", BCON_INT32 (0));
   ret = mongoc_collection_insert_one (
      coll, doc, insert_opts, NULL /* reply */, error);
   if (!ret) {
      goto fail;
   }
   bson_destroy (doc);
   mongoc_collection_destroy (coll);
   coll = mongoc_client_get_collection (client, "mydb2", "bar");
   doc = BCON_NEW ("xyz", BCON_INT32 (0));
   ret = mongoc_collection_insert_one (
      coll, doc, insert_opts, NULL /* reply */, error);
   if (!ret) {
      goto fail;
   }

   /* Step 1: Start a client session. */
   session = mongoc_client_start_session (client, NULL /* opts */, error);
   if (!session) {
      goto fail;
   }

   /* Step 2: Optional. Define options to use for the transaction. */
   txn_opts = mongoc_transaction_opts_new ();
   rp = mongoc_read_prefs_new (MONGOC_READ_PRIMARY);
   rc = mongoc_read_concern_new ();
   mongoc_read_concern_set_level (rc, MONGOC_READ_CONCERN_LEVEL_LOCAL);
   mongoc_transaction_opts_set_read_prefs (txn_opts, rp);
   mongoc_transaction_opts_set_read_concern (txn_opts, rc);
   mongoc_transaction_opts_set_write_concern (txn_opts, wc);

   /* Step 3: Use mongoc_client_session_with_transaction to start a transaction,
    * execute the callback, and commit (or abort on error). */
   ret = mongoc_client_session_with_transaction (
      session, callback, txn_opts, NULL /* ctx */, NULL /* reply */, error);
   if (!ret) {
      goto fail;
   }

   success = true;
fail:
   bson_destroy (doc);
   mongoc_collection_destroy (coll);
   bson_destroy (insert_opts);
   mongoc_read_concern_destroy (rc);
   mongoc_read_prefs_destroy (rp);
   mongoc_write_concern_destroy (wc);
   mongoc_transaction_opts_destroy (txn_opts);
   mongoc_client_session_destroy (session);
   mongoc_client_destroy (client);
   return success;
}

/* Define the callback that specifies the sequence of operations to perform
 * inside the transactions. */
static bool
callback (mongoc_client_session_t *session,
          void *ctx,
          bson_t **reply,
          bson_error_t *error)
{
   mongoc_client_t *client = NULL;
   mongoc_collection_t *coll = NULL;
   bson_t *doc = NULL;
   bool success = false;
   bool ret = false;

   client = mongoc_client_session_get_client (session);
   coll = mongoc_client_get_collection (client, "mydb1", "foo");
   doc = BCON_NEW ("abc", BCON_INT32 (1));
   ret =
      mongoc_collection_insert_one (coll, doc, NULL /* opts */, *reply, error);
   if (!ret) {
      goto fail;
   }
   bson_destroy (doc);
   mongoc_collection_destroy (coll);
   coll = mongoc_client_get_collection (client, "mydb2", "bar");
   doc = BCON_NEW ("xyz", BCON_INT32 (999));
   ret =
      mongoc_collection_insert_one (coll, doc, NULL /* opts */, *reply, error);
   if (!ret) {
      goto fail;
   }

   success = true;
fail:
   mongoc_collection_destroy (coll);
   bson_destroy (doc);
   return success;
}

同样请参阅:

事务和原子性

说明

分布式事务和多文档事务

从MongoDB 4.2开始,这两个术语是同义词。分布式事务是指分片集群和副本集上的多文档事务。从MongoDB 4.2开始,多文档事务(无论是在分片集群上还是副本集上)也称为分布式事务。

对于多文档(在单个或多个集合中)读写上有原子性要求的场景,MongoDB提供了多文档事务支持:

  • 在4.0版本中,MongoDB支持副本集上的多文档事务。

  • 在4.2版本中,MongoDB引入了分布式事务,增加了对分片集群上多文档事务的支持,并合并了对副本集上多文档事务的现有支持。

    为了在MongoDB 4.2部署(副本集和分片集群)上使用事务,客户端必须使用为MongoDB 4.2更新的MongoDB驱动程序。

Multi-document transactions are atomic (i.e. provide an "all-or-nothing" proposition):

多文档事务是原子的(即提供“全有或全无”的语义):

  • 当事务提交时,事务中所做的所有数据更改都将保存并在事务外部可见。也就是说,事务不会在回滚其他更改时提交其某些更改。

    在事务提交之前,事务中所做的数据更改在事务之外是不可见的。

  • 当事务中止时,事务中所做的所有数据更改都将被丢弃,而不会变得可见。例如,如果事务中的任何操作失败,事务就会中止,并且事务中所做的所有数据更改都将被丢弃,而不会变得可见。

重要

TIP

同样请参阅:

事务和操作

分布式事务可用于跨多个操作、集合、数据库、文档以及从MongoDB 4.2开始可以跨分片。

对于事务:

  • 事务中使用的集合可以位于不同的数据库中。

    提示

    你不能在跨分片的写事务中创建新集合。例如,如果你想对一个分片中已存在的集合进行写入且在另外一个不同的分片中隐式地创建集合,那么MongoDB无法在同一事务中执行这两种操作。

  • 你不能读/写config、admin或local数据库中的集合。

  • 你不能写system.*集合。

  • 你不能返回这类支持操作的查询计划(即explain)。

提示

提示

同样请参阅:

在事务中创建集合和索引

当在事务内部创建一个集合时:

  • 一个不存在的集合。集合的创建是作为操作的一部分。

  • 先前在同一事务中创建的新空集合。

限制

  • 你不能在跨分片的写事务中创建新集合。例如,如果要对一个分片中已存在的集合执行写入操作且在另外一个不同的分片中隐式地创建集合,那么MongoDB无法在同一事务中执行这两种操作。

  • 命令
    Method

提示

同样请参阅:

计数操作

Distinct操作

为了在事务中执行一个distinct操作:

    • 替代db.coll.distinct("x"),请使用:

      db.coll.aggregate([
         { $group: { _id: null, distinctValues: { $addToSet: "$x" } } },
         { $project: { _id: 0 } }
      ])
    • 替代db.coll.distinct("x", { status: "A" }),请使用:

      db.coll.aggregate([
         { $match: { status: "A" } },
         { $group: { _id: null, distinctValues: { $addToSet: "$x" } } },
         { $project: { _id: 0 } }
      ])

    管道将游标返回到文档:

    { "distinctValues" : [ 2, 3, 1 ] }

    迭代游标来访问结果集文档。

信息类操作

受限制的操作

在4.4版本中变更。

下列这些操作在事务中是不被允许的:

  • 在跨分片写入事务中创建新的集合。例如,如果在一个分片中对现有集合进行写入并在不同分片中隐式创建一个集合,则MongoDB无法在同一事务中执行这两种操作。

提示

同样请参阅:

事务和会话

  • 事务是与某个会话相关联的;即你为一个会话启动一个事务。

  • 在任何给定时间,一个会话最多可以有一个打开的事务。

  • 使用驱动程序时,事务中的每个操作都必须与会话相关联。有关详细信息,请参阅你使用的驱动程序文档。

  • 如果一个会话结束了并且它有一个打开的事务,则事务会中止。

读关注/写关注/读偏好

事务和读偏好

  • 如果事务级别的读偏好没有设置,事务会使用会话级别的读偏好。

事务和读关注

  • 如果事务级别的读关注没有设置,事务级的读关注默认为会话级的读关注。

事务支持下列的读关注级别:

"local"

"majority"

"snapshot"

事务和写关注

提示

不要为事务内的单个写操作显式设置写关注。为事务内的单个写操作设置写关注会导致错误。

  • 如果事务级别的写关注没有设置,事务级写关注默认为提交的会话级写关注。

w: 1

  • 重要

w: "majority"

说明

通用信息

生产注意事项

仲裁节点

如果任何事务操作从包含仲裁节点的分片读取或写入,其写操作跨越多个分片的事务将出错并中止。

禁用读关注majority

  • 在分片集群上,

  • 在副本集上,

提示

分片配置限制

说明

诊断

MongoDB提供了多种事务相关指标:

Source
Returns

功能兼容版本(FCV)

部署架构

最小featureCompatibilityVersion

副本集

4.0

分片集群

4.2

为了检查成员的FCV,连接到成员并运行下面的命令:

db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )

存储引擎

  • 主节点使用WiredTiger存储引擎,同时

在MongoDB 4.0中,只有使用WiredTiger存储引擎的副本集支持事务。

说明

附加事务主题

原文链接:https://docs.mongodb.com/manual/core/transactions/

译者:李正洋

有关shell中的示例,请参阅。

然而,当事务写入多个分片时,并非所有外部读取操作都需要等待已提交事务的结果在分片中可见。例如,如果事务已提交并且写入操作1在分片A上可见,但写入操作2在分片B上尚不可见,则外部读关注为的读操作可以读取写入操作1的结果,看不到写入操作2。

在大多数情况下,多文档事务比单文档写入会产生更大的性能成本,并且多文档事务的可用性不应替代有效的模型设计。对于许多场景, 依然会是最适合你的数据和用例。也就是说,对于许多场景,适当地对数据进行建模可以最大限度地减少对多文档事务的需求。

有关其他事务使用注意事项(例如runtime限制和oplog大小限制),另请参阅。

可以在现有集合上指定读/写(CRUD)操作。 有关CRUD操作的列表,请参阅。

当使用"4.4"或更高版本时,可以在事务中创建集合和索引。详情请参考。

你不能写入集合。(从 MongoDB 4.2 开始)

对于在事务外部创建的游标,你不能在事务内部调用。

对于在事务内创建的游标,你不能在事务外调用。

从MongoDB 4.2开始,你不能将定义为中的第一个操作。

有关事务中不支持的操作列表,请参阅。

在开始事务之前立即创建或删除集合时,如果在事务内访问该集合,注意使用写关注来执行这些创建或删除操作,从而确保事务可以获取到所需要的锁。

从MongoDB 4.4开始,使用"4.4",可以在中创建集合和索引,除非事务是跨分片写入事务。如果使用"4.2"或更低版本,事务中不允许使用影响数据库目录的操作,例如创建或删除集合和索引。

可以,例如:

针对一个不存在的集合上执行,或者

针对一个不存在集合上执行带有upsert: true选项的。

可以使用命令或其帮助函数[db.createCollection()](https://docs.mongodb.com/manual /reference/method/db.createCollection/#mongodb-method-db.createCollection)。

[[1]](https: //docs.mongodb.com/manual/core/transactions/#footnote-create-existing-index),要创建的索引需满足下面两者之一情况:

[]

还可以对现有索引运行和来检查是否存在。这些操作会成功地返回且不会创建索引。

要在事务内显式创建集合或索引,事务读关注级别必须为。显式创建是通过:

参数必须为true(默认值)。在对分片集群设置参数时,请在所有分片上设置该参数。

要在事务中执行计数操作,请使用聚合阶段或带有[$sum](https ://docs.mongodb.com/manual/reference/operator/aggregation/sum/#mongodb-group-grp.-sum)表达式的聚合阶段。

与4.0特性兼容的MongoDB驱动程序提供了一个集合级别的APIcountDocuments(filter, options)作为带有表达式的[$group](https://docs.mongodb.com/manual/reference/operator /aggregation/group/#mongodb-pipeline-pipe.-group)的帮助函数来执行计数。4.0驱动程序已弃用count() API。

从MongoDB4.0.3开始,shell提供了在中使用带有[$sum](https://docs.mongodb.com/ manual/reference/operator/aggregation/sum/#mongodb-group-grp.-sum)表达式的来执行计数的帮助函数。

对于未分片的集合,可以使用[db.collection.distinct()](https://docs.mongodb.com/manual/reference/method/db.collection.distinct/#mongodb-method-db.collection .distinct)方法/命令以及带有阶段的聚合管道。

对于分片的集合,不能使用 方法或者命令。

要查找分片集合的不同值,请使用带阶段的聚合管道作为替代。例如:

信息类操作命令,比如, , (以及它们的辅助函数)是被允许在事务中使用的。然而,它们不能作为事务中的第一个操作。

影响数据库catalog的操作,例如在创建或删除集合和索引时使用"4.2"或更低的。使用fcv"4.4"或更高版本,可以在事务中创建集合和索引,除非事务是跨分片写入事务。有关详细信息,请参阅。

,例如方法和索引,例如和方法,当使用以外的读取关注级别时。

和命令及其辅助函数。

其他非CRUD和非信息类操作,比如,,等以及它们的辅助函数。

在事务中使用事务级的操作。

在使用驱动时,你可以在事务开始时设置事务级别的:

如果事务级别和会话级别的读偏好没有设置,事务使用客户端级别的读偏好。默认情况下,客户端级别的读偏好是。

包含读操作的必须使用读偏好。在一个给定事务中的所有操作都必须路由到同一个成员。

在事务中的操作会使用事务级。也就是说,在事务内部忽略在集合和数据库级别设置的任何读关注。

可以在事务开始时设置事务级别的。

如果事务级和会话级的读关注没有设置,事务级的读关注默认为客户端级的读关注。默认情况下,客户端级的读取关注是用于针对主节点的读取。同样请参阅:

读关注会返回节点最新可用的数据,但可能被回滚。

对于分片集群上的事务,读关注不能保证数据来自同一个跨分片的快照视图。如果需要快照隔离,请使用 读关注。

从MongoDB 4.4开始,使用"4.4"或更高,可以在事务内。如果地创建集合或索引,事务必须使用读关注。地创建集合可使用任何适用于事务的读关注。

如果事务以的方式提交,则读关注会返回已被副本集中大多数成员确认的数据(即数据不会被回滚)。

如果事务不用的方式提交,读关注不能保证读操作读取到大多数已提交的数据。

对于分片集群上的事务,读关注不能保证数据来自同一个跨分片的快照视图。如果需要快照隔离,请使用读关注。

如果事务以的方式提交,则读关注会从一个大多数已提交数据的快照中返回数据。

如果事务不用的方式提交,读关注不能保证读操作读取到大多数已提交的数据。

对于分片集群上的事务,数据的视图是跨分片同步的。

事务使用事务级来提交写操作。事务内的写操作必须没有显式定义写关注,并使用默认的写关注。在提交时,然后使用事务级写关注提交写入。

可以在事务开始时设置事务级别的:

如果事务级写关注和会话级写关注没有设置,事务级写关注默认为客户端级写关注。默认情况下,客户端写关注为。也可以参考。

事务支持所有写关注的值,包括:

写关注会在提交已经被应用到主节点后反馈确认结果。

当使用提交,事务在发生故障时可能会回滚。

当使用写关注提交,事务级的读关注无法保证事务中的读操作能读取大多数已提交的数据。

当使用 写关注提交,事务级的读关注无法保证事务中的读操作能使用大多数已提交数据的快照。

写关注会在提交的数据被应用到大多数(M)有投票权的成员后返回确认;即提交数据已被应用到主节点和(M-1)有投票权的从节点。

当使用写关注提交时,事务级读关注可以确保操作能读取到大多数已提交的数据。对于分片集群上的事务,这种大多数已提交数据的视图在分片之间不会同步。

当使用写关注提交时,事务级读关注可以确保证操作能获取来自大多数已提交数据的同步快照。

不管,分片集群事务的提交操作包括一部分使用了{w: "majority", j: true}写关注的操作。

关于使用事务的各种生产注意事项,请参阅。另外,如果是分片集群,同样请参阅。

另请参阅,了解在分片上已禁用读关注 majority的事务限制。

三成员PSA(主-从-仲裁)副本集或者拥有三成员PSA分片的分片集群可能已经禁用了读关注majority(或)

如果事务涉及到具有的分片,则不能对事务使用读关注。你只能对事务使用读关注或者。如果使用读关注,则事务会报错并中止。readConcern level 'snapshot' is not supported in sharded clusters when enableMajorityReadConcern=false。如果事务的任何读取或写入操作涉及已禁用读关注"majority"的分片,则其跨越多个分片进行写入操作的事务会出错并中止。

可以定义读关注、或者甚至在已的副本集上使用。但是,如果你计划迁移到有分片禁用读关注majority的分片集群上,可能希望避免使用读关注"snapshot"。

要检查读关注"majority"是否被禁用,可以在实例上运行并检查字段。如果值为false,则表示读关注"majority"已禁用。

更多信息请参考和。

不能在包含设置为false 分片的分片集群上运行事务(例如包含使用了作为投票成员的分片)。

不管,分片集群事务的提交操作都会包含一部分使用了{w: "majority", j: true}写关注的操作。

方法中的命令

返回 相关指标。

聚合管道

如果操作作为事务的一部分则返回:。持有锁的的信息会作为事务的一部分。 是写入多个分片的分片事务的指标。

方法中的命令

如果操作作为事务的一部分则返回。是写入多个分片的分片事务的指标。

和日志信息

在日志组件下包含慢事务的信息(即事务超过了 阈值)

为了使用事务,部署架构中所有成员的至少为:

更多信息详见参考页。

从MongoDB 4.2开始,支持副本集和分片集群,其中:

从节点使用WiredTiger存储引擎或存储引擎。

你不能在包含设置为 false 分片的分片集群上运行事务,例如包含使用了作为投票成员的分片。

要了解有关何时使用事务以及它们是否支持你的用例的更多信息,请参阅来自MongoDB.live 2020的演示。

事务级读关注
事务级读偏好
在事务中创建集合和索引
mongo
mongoShell示例
"local"
反范式化数据模型(嵌入文档和数组)
生产注意事项
Commit期间的外部读操作
CRUD操作
功能兼容版本(fcv)
在事务中创建集合和索引
capped
getMore
getMore
killCursors
事务
受限操作
"majority"
事务和操作参考
功能兼容性版本(fcv)
多文档事务
隐式创建一个集合
插入操作
update/findAndModify操作
create
显式地创建一个集合
在事务中创建索引
"local"
shouldMultiDocTxnCreateCollectionAndIndexes
受限制的操作
$count
$group
$sum
mongo
db.collection.countDocuments()
$group
distinct
$group
db.collection.distinct()
distinct
$group
hello
buildInfo
connectionStatus
功能兼容版本(fcv)
在事务中创建集合和索引
显式创建集合
db.createCollection()
db.collection.createIndexes()
db. collection.createIndex()
"local"
listCollections
listIndexes
createUser
getParameter
count
待处理的DDL操作和事务
事务和操作参考
读偏好
读偏好
primary
多文档事务
primary
读关注
读关注
"local"
事务和读偏好
默认MongoDB读关注/写关注
"local"
"local"
"snapshot"
功能兼容版本(fcv)
创建集合和索引
显式
"local"
隐式
写关注“majority”
"majority"
写关注“majority”
"majority"
"majority"
"snapshot"
写关注“majority”
"snapshot"
写关注“majority”
"snapshot"
"snapshot"
写关注
写关注
w: 1
默认MongoDB读关注/写关注
w
w: 1
w: 1
w: 1
"majority"
w: 1
"snapshot"
w: "majority"
w: "majority"
w: "majority"
w: "majority"
"snapshot"
为事务指定的写关注
生产注意事项
生产注意事项(分片集群)
Disabled Read Concern Majority
--enableMajorityReadConcern false
replication.enableMajorityReadConcern: false
禁用读关注“majority”
"snapshot"
"local"
"majority"
"snapshot"
"local"
"majority"
禁用读关注"majority"
"snapshot"
mongod
db.serverStatus()
storageEngine.supportsCommittedReads
三成员PSA架构
三成员PSA分片
writeConcernMajorityJournalDefault
内存存储引擎
为事务指定的写关注
featureCompatibilityVersion
setFeatureCompatibilityVersion
多文档事务
in-memory
writeConcernMajorityJournalDefault
内存存储引擎
驱动程序API
生产考虑因素
生产考虑因素(分片集群)
事务和操作
Are Transactions Right for You?
1
db.collection.createIndex()
db.collection.createIndexes()
create
db.createCollection()
createIndexes
db.collection.createIndex()
db.collection.createIndexes()
db.serverStatus()
serverStatus
transactions
$currentOp
$currentOp.transaction
非活动会话
$currentOp.twoPhaseCommitCoordinator
db.currentOp()
currentOp
currentOp.transaction
$currentOp.twoPhaseCommitCoordinator
mongod
mongos
TXN
operationProfiling.slowOpThresholdMs