Docs 菜单

Docs 主页开发应用程序MongoDB Manual

Session.withTransaction()

在此页面上

  • 定义
  • 兼容性
  • 行为
Session.withTransaction( <function> [, <options> ] )

mongosh v1.1.0 中的新增内容

在事务中运行指定的 lambda 函数。如果出现错误,该方法将重试:

  • 提交操作(如果提交失败)。

  • 整个事务(如果此错误允许)。

Session.withTransaction()方法接受 事务选项。

返回:回调函数生成的值。

重要

mongosh 方法

本页介绍了mongosh方法。这不是数据库命令或特定语言驱动程序(例如 Node.js)的文档。

有关数据库命令,请参阅 commitTransaction 命令。

对于 MongoDB API 驱动程序,请参阅特定语言的MongoDB 驱动程序文档。

对于传统 mongo Shell 文档,请参阅相应 MongoDB Server 版本的文档:

mongo shell v4.4

此方法可用于以下环境中托管的部署:

  • MongoDB Atlas :用于在云中部署 MongoDB 的完全托管服务

注意

所有 MongoDB Atlas 集群都支持此命令。有关所有命令的信息,请参阅不支持的命令。

Node.js 驱动程序有一个Session.withTransaction()版本,称为Callback APICallback API还接受回调,但 Node.js 方法的返回类型必须是 Promise。 mongosh Session.withTransaction()方法不需要 Promise。示例 -------

以下示例创建了 balances 集合,并使用事务在两个客户之间转账。

创建 balances 集合:

use accounts
db.balances.insertMany( [
{ customer: "Pat", balance: Decimal128( "35.88" ) },
{ customer: "Sasha", balance: Decimal128( "5.23" ) }
] )

对事务中使用的某些变量进行初始化:

var fromAccount = "Pat"
var toAccount = "Sasha"
var transferAmount = 1
var dbName = "accounts"
var collectionName = "balances"

启动会话,然后运行事务以更新账户:

var session = db.getMongo().startSession( { readPreference: { mode: "primary" } } );
session.withTransaction( async() => {
const sessionCollection = session.getDatabase(dbName).getCollection(collectionName);
// Check needed values
var checkFromAccount = sessionCollection.findOne(
{
"customer": fromAccount,
"balance": { $gte: transferAmount }
}
)
if( checkFromAccount === null ){
throw new Error( "Problem with sender account" )
}
var checkToAccount = sessionCollection.findOne(
{ "customer": toAccount }
)
if( checkToAccount === null ){
throw new Error( "Problem with receiver account" )
}
// Transfer the funds
sessionCollection.updateOne(
{ "customer": toAccount },
{ $inc: { "balance": transferAmount } }
)
sessionCollection.updateOne(
{ "customer": fromAccount },
{ $inc: { "balance": -1 * transferAmount } }
)
} )

Lambda 函数包括在更新balances集合之前验证操作的初始检查。

MongoDB 自动完成事务。

  • 如果两个 updateOne() 操作均成功,则 Session.withTransaction() 在回调返回时提交事务。

  • 如果回调内引发异常,Session.withTransaction() 将结束事务并回滚所有未提交的更改。

注意

默认情况下,MongoDB 会结束运行超过60秒的事务。如果要延长默认超时时间以试验mongosh中的事务,请参阅运行时限制。

← Session.startTransaction()

在此页面上