交易次数 > 生产注意事项(共享群集)
从版本4.2开始,MongoDB提供了对分片群集执行多文档事务的功能。
下页列出了特定于分片群集上运行事务的问题。除了生产注意事项中列出的那些关注之外,这些关注也是 。
对于MongoDB 4.2部署(副本集和分片群集)上的事务,客户端必须使用针对MongoDB 4.2更新的MongoDB驱动程序。
在具有多个mongos
实例的分片群集上,使用针对MongoDB 4.0(而非MongoDB 4.2)更新的驱动程序执行事务将失败,并可能导致错误,包括:
注意
您的驱动程序可能会返回其他错误。有关详细信息,请参阅驱动程序的文档。
错误代码 | 错误信息 |
---|---|
251 | cannot continue txnId -1 for session ... with txnId 1 |
50940 | cannot commit with no participants |
针对单个分片的事务应具有与副本集事务相同的性能。
要指定时间限制,请maxTimeMS
在上指定一个限制
commitTransaction
。
如果maxTimeMS
未指定,则MongoDB将使用
transactionLifetimeLimitSeconds
。
如果maxTimeMS
指定,但会导致交易超出transactionLifetimeLimitSeconds
,则MongoDB将使用transactionLifetimeLimitSeconds
。
要修改分片transactionLifetimeLimitSeconds
群集,必须为所有分片副本集成员修改参数。
多文档事务的支持"local"
,
"majority"
和"snapshot"
阅读的关注水平。
对于分片群集上的事务,只有"snapshot"
读取关注点才能
在多个分片之间提供一致的快照。
有关已读关注和交易的更多信息,请参见 交易和已关注关注。
您不能在具有writeConcernMajorityJournalDefault
设置为的分片的分片群集上运行事务false
(例如,具有使用内存存储引擎的投票成员的分片)。
对于具有三成员PSA分片的分片群集,您可能已
禁用“读多数”
(即或
),以避免缓存压力。--enableMajorityReadConcern false
replication.enableMajorityReadConcern: false
如果事务涉及已禁用读关注度“多数”的分片,则不能"snapshot"
对事务使用读关注度。您只能使用已读关注"local"
或
"majority"
用于事务。如果使用读取关注"snapshot"
,则事务错误并中止。
如果任何事务的读或写操作涉及禁用了读取关注的分片,则其写操作跨越多个分片的事务将出错并中止
"majority"
。
db.serverStatus()
并检查该
storageEngine.supportsCommittedReads
字段。如果为
false
,则禁用“大多数”关注。警告
mongodump
并且不能作为正在进行分片事务的4.2+分片群集的备份策略的一部分,因为使用创建的备份
不能保持分片事务的原子性保证。mongorestore
mongodump
对于具有正在进行中的分片事务的4.2+分片群集,请使用以下协调的备份和还原过程之一,该过程 确实维护了跨分片事务的原子性保证:
块迁移在某些阶段获得排他的收集锁。
如果正在进行的事务锁定了集合,并且涉及该集合的块迁移开始,则这些迁移阶段必须等待事务释放对集合的锁定,从而影响块迁移的性能。
如果大块迁移与事务交织(例如,如果在大块迁移已在进行的同时启动事务,并且迁移在事务锁定集合之前完成),则提交期间的事务错误并中止。
根据两个操作的交错方式,包括一些示例错误(错误消息已被缩写):
an error from cluster data placement change ... migration commit in progress for <namespace>
Cannot find shardId the chunk belonged to at cluster time ...
在提交事务期间,外部读取操作可能会尝试读取将由事务修改的相同文档。如果事务写入多个分片,则在尝试进行分片提交时
snapshot
或
"linearizable"
或属于因果一致会话(即,包括afterClusterTime)的外部读取等待事务的所有写入均可见。也可以看看
对于 集合上的复制索引构建(与滚动索引构建相对),一旦针对主副本集成员发布的索引构建完成,辅助成员将应用关联的oplog条目并开始索引构建。在建立索引时,辅助数据库等待应用以后的任何oplog条目,包括在构建期间提交的分布式事务。如果复制停顿的时间超过oplog窗口的时间,则辅助副本将失去同步,并需要重新同步才能恢复。
为了最大程度地减少分片事务和索引之间的潜在交互,请考虑以下在分片集群上构建索引的策略之一: