驱动程序 API
回调 API 和 核心 API
启动一个事务,执行指定的操作,并提交(或出错时中止)。
自动包含
"TransientTransactionError"和"UnknownTransactionCommitResult"的错误处理逻辑。
需要显式调用来启动事务并提交事务。
不包含
"TransientTransactionError"和"UnknownTransactionCommitResult"的错误处理逻辑,而是为这些错误提供了包含自定义错误处理的灵活性。
回调 API
回调 API 包含以下逻辑:
如果事务遇到
"TransientTransactionError",则作为一个整体重试事务。如果提交遇到
"UnknownTransactionCommitResult",则重新这个提交操作。
示例
➤ 使用右上角的选择您的语言下拉菜单来设置此页面上示例的语言。
该示例使用新的回调 API 来处理事务,它启动事务、执行指定的操作并提交(或在出错时中止)。新的回调 API 包含 "TransientTransactionError" 或 "UnknownTransactionCommitResult" 提交错误的重试逻辑。
重要
推荐.。使用针对 MongoDB 部署版本更新的 MongoDB 驱动程序。 对于 MongoDB 4.2 部署(副本集和分片集群)上的事务,客户端必须使用为 MongoDB 4.2 更新的 MongoDB 驱动程序。
使用驱动程序时,事务中的每个操作必须与会话相关联(即将会话传递给每个操作)。
在 MongoDB 4.2 及更早版本中,你无法在事务中创建集合。 如果在事务内部运行,导致文档插入的写操作(例如
insert或带有upsert: true的更新操作)必须在 已有的 集合上执行。从 MongoDB 4.4 开始,你可以隐式或显式地在事务中创建集合。 但是,你比须使用针对 4.4 更新的 MongoDB 驱动程序。 有关详细信息,请参阅 在事务中创建集合和索引。
核心 API
核心事务 API 不包含标记错误的重试逻辑:
"TransientTransactionError"。如果事务中的操作返回标记为"TransientTransactionError"的错误,则事务会被作为一个整体进行重试。"UnknownTransactionCommitResult"。如果提交返回标记为"UnknownTransactionCommitResult"的错误,提交会被重试。为了处理
"UnknownTransactionCommitResult",应用程序应该明确地包含错误的重试逻辑。
示例
➤ 使用右上角的选择您的语言下拉菜单来设置此页面上示例的语言。
以下的示例包含了针对暂时性错误重试事务和针对未知提交错误重试提交的逻辑:
驱动程序版本
对于 MongoDB 4.2 部署(副本集和分片集群)上的事务,客户端必须使用为 MongoDB 4.2 更新的 MongoDB 驱动程序:
对于 MongoDB 4.0 副本集上的事务,客户端需要为 MongoDB 4.0 或更高版本更新 MongoDB 驱动程序。
事务错误处理
无论是哪种数据库系统,无论是MongoDB还是关系型数据库,应用程序都应该采取措施处理事务提交过程中的错误,并包含事务的重试逻辑。
"TransientTransactionError"
"TransientTransactionError"无论 retryWrites的值是多少,事务内部的单个写操作都不可重试。如果操作遇到一个错误与标签相关 "TransientTransactionError",比如当主节点降级,事务会作为一个整体被重试。
回调 API 包含了
"TransientTransactionError"的重试逻辑。核心事务 API 不包含
"TransientTransactionError"的重试逻辑。为了处理"TransientTransactionError",应用程序应该明确地包含错误的重试逻辑。
"UnknownTransactionCommitResult"
"UnknownTransactionCommitResult"提交操作是可重试的写操作。如果提交操作遇到错误,无论 retryWrites的值是多少,MongoDB 驱动程序都会重试提交。
如果提交操作遇到标记为 "UnknownTransactionCommitResult"的错误,提交可以被重试。
回调 API 包含了
"UnknownTransactionCommitResult"的重试逻辑。核心事务 API 不包含
"UnknownTransactionCommitResult"的重试逻辑。为了处理"UnknownTransactionCommitResult",应用程序应该明确地包含错误的重试逻辑。
驱动程序版本错误
在具有多个 mongos 实例的分片集群上,使用为 MongoDB 4.0 更新的驱动程序执行事务 (而不是 MongoDB 4.2)将失败并可能导致错误,包括:
注释
你的驱动程序可能会返回不同的错误。 有关详细信息,请参阅驱动程序的文档。
251
cannot continue txnId -1 for session ... with txnId 1
50940
cannot commit with no participants
对于 MongoDB 4.2 部署(副本集和分片集群)上的事务,使用为 MongoDB 4.2 更新的 MongoDB 驱动程序
附加信息
mongo Shell 示例
mongo Shell 示例下面列出的 mongo shell 方法可用于事务:
注释
mongo shell 示例为了简单起见省略了重试逻辑和强大的错误处理。 有关在应用程序中包含事务的更实际示例,请参阅 事务错误处理 .
原文链接:https://docs.mongodb.com/manual/core/transactions-in-applications/
译者:李正洋
最后更新于