Session.withTransaction()
정의
Session.withTransaction( <function> [, <options> ] )
mongosh v1.1.0의 새로운 기능
트랜잭션 내에서 지정된 Lambda 함수를 실행합니다. 오류가 발생하면 메서드는 다음을 다시 시도합니다.
커밋 작업(커밋 실패가 있는 경우)
전체 트랜잭션(오류가 허용되는 경우)
Session.withTransaction()
메서드는 트랙잭션 옵션을 허용합니다.반환합니다: 콜백 함수에 의해 생성된 값입니다. 중요
Mongo쉬 방법
이 페이지에서는
mongosh
메서드에 대해 설명합니다. 이는 데이터베이스 명령 또는 Node.js와 같은 언어별 드라이버에 대한 설명서가 아닙니다.데이터베이스 명령의 경우
commitTransaction
명령을 참조하세요.MongoDB API 드라이버의 경우 언어별 MongoDB 드라이버 설명서를 참조하세요.
호환성
이 메서드는 다음 환경에서 호스팅되는 배포에서 사용할 수 있습니다.
MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스
참고
이 명령은 모든 MongoDB Atlas 클러스터에서 지원됩니다. 모든 명령에 대한 Atlas 지원 에 대한 자세한 내용은 지원되지 않는 명령을 참조하세요.
MongoDB Enterprise: MongoDB의 구독 기반 자체 관리 버전
MongoDB Community: MongoDB의 소스 사용 가능 무료 자체 관리 버전
행동
Node.js 드라이버에는 Callback API라고 하는 Session.withTransaction()
의 버전이 있습니다. 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()
으로 트랜잭션을 종료하고 커밋되지 않은 변경 사항을 롤백합니다.