Session.withTransaction()
정의
Session.withTransaction( <function> [, <options> ] )
mongosh v1.1.0의 새로운 기능
트랜잭션 내에서 지정된 Lambda 함수를 실행합니다. 오류가 발생하면 메서드는 다음을 다시 시도합니다.
커밋 작업(커밋 실패가 있는 경우)
전체 트랜잭션(오류가 허용되는 경우)
중요
Mongo쉬 방법
이 페이지에서는
mongosh
메서드를 설명합니다. 이는 데이터베이스 명령 또는 Node.js와 같은 언어별 드라이버에 대한 설명서가 아닙니다.데이터베이스 명령의 경우
commitTransaction
명령을 참조하세요.MongoDB API 드라이버의 경우 언어별 MongoDB 드라이버 설명서를 참조하세요.
메서드는
Session.withTransaction()
트랜잭션 옵션을 허용합니다.
행동
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()
으로 트랜잭션을 종료하고 커밋되지 않은 변경 사항을 롤백합니다.