Session.withTransaction()
定义
Session.withTransaction( <function> [, <options> ] )
mongosh v1.1.0 中的新增内容
在事务中运行指定的 lambda 函数。如果出现错误,该方法将重试:
提交操作(如果提交失败)。
整个事务(如果此错误允许)。
Session.withTransaction()
方法接受事务选项。返回: 回调函数生成的值。 重要
mongosh 方法
本页面提供
mongosh
方法的相关信息。这不是数据库命令或特定语言驱动程序(例如 Node.js)的相关文档。有关数据库命令,请参阅
commitTransaction
命令。如需了解 MongoDB API 驱动程序,请参阅特定语言的 MongoDB 驱动程序文档。
兼容性
此方法可用于以下环境中托管的部署:
MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务
注意
所有 MongoDB Atlas 集群都支持此命令。有关 Atlas 对所有命令的支持的信息,请参阅不支持的命令。
MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本
MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本
行为
Node.js 驱动程序的 Session.withTransaction()
版本被称为 Callback API。Callback 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()
将结束事务并回滚所有未提交的更改。