트랜잭션 및 작업
거래의 경우:
트랜잭션에서 컬렉션과 인덱스를 생성할 수 있습니다. 자세한 내용은 트랜잭션에서 컬렉션 및 인덱스 만들기를 참조하세요.
트랜잭션에 사용되는 컬렉션은 서로 다른 데이터베이스에 있을 수 있습니다.
참고
샤드 간 쓰기 트랜잭션에서는 새 컬렉션을 생성할 수 없습니다. 예를 들어, 하나의 샤드에서 기존 컬렉션에 쓰고 다른 샤드에서 암시적으로 새 컬렉션을 생성하는 경우, MongoDB는 동일한 트랜잭션에서 두 작업을 모두 수행할 수 없습니다.
제한된 컬렉션에는 쓸 (write) 수 없습니다.
제한된 컬렉션에서 읽을 때는 읽기 고려
"snapshot"
을(를) 사용할 수 없습니다. (MongoDB 5.0부터 도입됨)config
,admin
또는local
데이터베이스의 컬렉션을 읽고 쓸 수 없습니다.system.*
컬렉션에 쓸 수 없습니다.explain
또는 이와 유사한 명령을 사용하여 지원되는 작업의 쿼리 계획을 반환할 수 없습니다.
트랜잭션 외부에서 생성된 커서의 경우 트랜잭션 내부에서
getMore
을(를) 호출할 수 없습니다.트랜잭션에서 생성된 커서의 경우 트랜잭션 외부에서
getMore
를 호출할 수 없습니다.
killCursors
명령을 트랜잭션 의 첫 번째 작업으로 지정할 수 없습니다.또한 트랜잭션 내에서
killCursors
명령을 실행 하면 서버 가 지정된 커서를 즉시 중지합니다. 트랜잭션 이 커밋 될 때까지 기다리지 않습니다 .
다중 문서 트랜잭션에서 지원되는 작업
CRUD 작업
트랜잭션에서 허용되는 읽기/쓰기 작업은 다음과 같습니다.
메서드 | 명령 | 참고 |
---|---|---|
비샤드형 컬렉션에서 사용할 수 있습니다. For sharded collections, use the aggregation pipeline with the
$group stage. See Distinct Operation. | ||
존재하지 않는 컬렉션에서 자세한 내용은 관리 작업을 참조하세요. | ||
존재하지 않는 컬렉션에서 실행하면 컬렉션이 암시적으로 생성됩니다. 자세한 내용은 관리 작업을 참조하세요. | ||
존재하지 않는 컬렉션에서 실행하면 컬렉션이 암시적으로 생성됩니다. 자세한 내용은 관리 작업을 참조하세요. | ||
존재하지 않는 컬렉션에서 실행하면 컬렉션이 암시적으로 생성됩니다. 자세한 내용은 관리 작업을 참조하세요. |
참고
샤드 키 값 업데이트
트랜잭션에서 또는 재시도 가능 쓰기로 단일 문서 업데이트/찾기 및 수정(update/findAndModify) 작업을 실행해 문서의 샤드 키 값을 업데이트할 수 있습니다(샤드 키 필드가 변경 불가능한 _id
필드인 경우 제외). 자세한 내용은 문서의 샤드 키 값 변경에서 확인하세요.
카운트 연산
트랜잭션 내에서 카운트 연산을 수행하려면 $count
집계 단계 또는 $group
($sum
표현식 포함) 집계 단계를 사용합니다.
MongoDB 드라이버는 $sum
표현식과 함께 $group
를 사용하여 카운트를 수행하는 헬퍼 메서드로서 컬렉션 수준 API countDocuments(filter, options)
을 제공합니다.
mongosh
는 $sum
표현식과 함께 $group
을 사용하여 카운트를 수행하는 헬퍼 메서드 db.collection.countDocuments()
를 제공합니다.
차별화된 운영
트랜잭션 내에서 고유한 작업을 수행합니다.
샤드되지 않은 컬렉션의 경우,
db.collection.distinct()
메서드/distinct
명령과$group
단계의 집계 파이프라인을 사용할 수 있습니다.리샤드된 컬렉션의 경우
db.collection.distinct()
메서드 또는distinct
명령을 사용할 수 없습니다.샤딩된 컬렉션의 고유 값을 찾으려면 대신
$group
단계의 집계 파이프라인을 사용합니다. 예시:db.coll.distinct("x")
0} 대신 다음을 사용합니다.db.coll.aggregate([ { $group: { _id: null, distinctValues: { $addToSet: "$x" } } }, { $project: { _id: 0 } } ]) db.coll.distinct("x", { status: "A" })
0} 대신 다음을 사용합니다.db.coll.aggregate([ { $match: { status: "A" } }, { $group: { _id: null, distinctValues: { $addToSet: "$x" } } }, { $project: { _id: 0 } } ])
파이프라인은 문서에 커서를 반환합니다.
{ "distinctValues" : [ 2, 3, 1 ] } 커서를 반복하여 결과 문서에 액세스합니다.
관리 운영
트랜잭션이 교차 샤드 쓰기 트랜잭션(write transaction)인 이 아닌 경우 분산 트랜잭션 내에서 컬렉션과 인덱스를 생성할 수 있습니다.
명시적 생성 작업
명령 | 메서드 | 참고 사항 |
---|---|---|
암시적 생성 작업도 참조하세요. | ||
생성할 인덱스는 컬렉션이 작업의 일부로 생성된 경우 존재하지 않는 컬렉션에 있어야 하며, 또는 동일한 트랜잭션에서 이전에 생성된 빈 신규 컬렉션에 있어야 합니다. |
참고
트랜잭션 내에서 컬렉션이나 인덱스를 명시적으로 만들려면 트랜잭션 읽기 고려 수준이 "local"
여야 합니다.
트랜잭션에서 컬렉션 및 인덱스 만드는 방법에 대한 자세한 내용은 트랜잭션에서 컬렉션 및 인덱스 생성을 참조하세요.
암시적 생성 작업
존재하지 않는 컬렉션에 대해 다음과 같은 쓰기 작업을 통해 컬렉션을 암시적으로 만들 수도 있습니다.
존재하지 않는 컬렉션에 대해 메서드 실행 | 존재하지 않는 컬렉션에 대해 명령 실행 |
---|---|
db.collection.findAndModify() with upsert: true db.collection.findOneAndReplace() with upsert: true db.collection.findOneAndUpdate() with upsert: true | findAndModify 와 upsert: true |
db.collection.updateOne() with upsert: true db.collection.updateMany() with upsert: true db.collection.replaceOne() with upsert: true | update 와 upsert: true |
db.collection.bulkWrite() with insert or upsert:true operationsVarious Bulk Operation Methods with insert or upsert:true operations |
트랜잭션에서 허용되는 다른 CRUD 작업은 CRUD 작업에서 확인하세요.
트랜잭션에서 컬렉션 및 인덱스 만드는 방법에 대한 자세한 내용은 트랜잭션에서 컬렉션 및 인덱스 생성을 참조하세요.
정보 운영
2} buildInfo
,hello
connectionStatus
, 과 같은 정보 명령(및 그 도우미 메서드) (및 해당 헬퍼 메서드)와 같은 정보 명령은 트랜잭션에서 허용되지만, 트랜잭션의 첫 번째 연산이 될 수는 없습니다.
제한된 작업
트랜잭션에서 허용되지 않는 작업은 다음과 같습니다.
다중 샤드 쓰기 트랜잭션에서 새로운 컬렉션을 생성하기. 예를 들어 하나의 샤드에서 기존 컬렉션에 쓰고 다른 샤드에 암시적으로 컬렉션을 생성하는 경우 MongoDB는 동일한 트랜잭션에서 두 작업을 모두 수행할 수 없습니다.
컬렉션의 명시적 생성 예:
db.createCollection()
메서드 및 인덱스 예:db.collection.createIndexes()
및db.collection.createIndex()
메서드("local"
이외의 읽기 문제 수준을 사용하는 경우).listCollections
2} 및 명령과 해당 도우미 메서드.listIndexes
createUser
,getParameter
,count
등과 해당 헬퍼와 같은 기타 비 CRUD 및 비 정보 작업입니다.