Docs Menu
Docs Home
/
MongoDB 매뉴얼
/ / / /

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 지원 에 대한 자세한 내용은 지원되지 않는 명령을 참조하세요.

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()으로 트랜잭션을 종료하고 커밋되지 않은 변경 사항을 롤백합니다.

참고

기본적으로 MongoDB는 60초 이상 실행되는 트랜잭션을 종료합니다. mongosh의 트랜잭션을 실험하기 위해 기본 타임아웃을 연장하려면 런타임 제한을 참조하세요.

돌아가기

Session.startTransaction()

이 페이지의 내용