문서 메뉴

문서 홈애플리케이션 개발MongoDB 매뉴얼

Session.withTransaction()

이 페이지의 내용

  • 정의
  • 호환성
  • 행동
Session.withTransaction( <function> [, <options> ] )

mongosh v1.1.0의 새로운 기능

트랜잭션 내에서 지정된 Lambda 함수를 실행합니다. 오류가 발생하면 메서드는 다음을 다시 시도합니다.

  • 커밋 작업(커밋 실패가 있는 경우)

  • 전체 트랜잭션(오류가 허용되는 경우)

메서드는 Session.withTransaction()트랜잭션 옵션을 허용합니다.

반환합니다:콜백 함수에 의해 생성된 값입니다.

중요

Mongo쉬 방법

이 페이지에서는 mongosh 메서드를 설명합니다. 이는 데이터베이스 명령이나 Node.js와 같은 언어별 드라이버에 대한 설명서가 아닙니다 .

데이터베이스 명령에 대해서는 commitTransaction 명령을 참조하십시오.

MongoDB API 드라이버의 경우 언어별 MongoDB 드라이버 설명서를 참조하세요.

레거시 mongo 셸 문서는 해당 MongoDB 서버 릴리스 문서를 참조하세요.

Mongo 셸 V4.4

이 방법은 다음 환경에서 호스팅되는 배포에서 사용할 수 있습니다.

  • MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스

참고

이 명령은 모든 MongoDB Atlas 클러스터에서 지원됩니다. 모든 명령에 대한 자세한 내용은 지원되지 않는 명령을 참조하세요.

Node.js 드라이버의 버전은 Session.withTransaction() 이며 콜백 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()으로 트랜잭션을 종료하고 커밋되지 않은 변경 사항을 롤백합니다.

참고

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

← Session.startTransaction()

이 페이지의 내용