programing

MongoDB 트랜잭션?

bestprogram 2023. 7. 16. 13:47

MongoDB 트랜잭션?

.NET에서 MongoDB와 NoRM을 가지고 노는 중.

것 - ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅠ
(그냥 말할 수는 없습니다.MongoConnection.Begin/EndTransaction또는 그와 비슷한 것).

작업 패턴과 롤백 변경의 단위를 사용하여 무언가가 실패할 경우를 대비하고 싶습니다.

IT 트랜잭션으로 저장소를 풍부하게 만드는 깨끗한 방법이 있습니까?

MongoDB는 복잡한 다중 문서 트랜잭션을 지원하지 않습니다.그것이 꼭 필요한 것이라면 아마도 당신에게 잘 맞지 않을 것입니다.

그러나 대부분의 경우 복잡한 트랜잭션은 필수가 아닙니다.MongoDB의 모든 작업은 단일 문서에서 원자적이며, 우리는 트랜잭션이 필요한 많은 작업을 쉽고 빠르게 구현할 수 있는 좋은 업데이트 수정자를 지원합니다.

MongoDB가 즉시 트랜잭션을 지원하지 않는 것은 사실이지만, 당신은 스스로 낙관적인 트랜잭션을 구현할 수 있습니다.그들은 일의 단위에 잘 맞습니다.당신이 C#에서 쉽게 반복할 수 있도록 Java 예제와 일부 설명을 GitHub에 작성했습니다.

v4.0 기준으로 MongoDB는 다중 문서 ACID 트랜잭션을 지원합니다.스냅샷 격리를 통해 트랜잭션은 전체적으로 일관된 데이터 보기를 제공하고 데이터 무결성을 유지하기 위해 모두 또는 아무것도 실행하지 않습니다.자세한 내용은 https://www.mongodb.com/transactions 를 참조하십시오.

4.2에서 MongoDB는 샤드 트랜잭션도 지원합니다.

블로그 게시물에서, 저는 또한 여러분이 역사와 우리의 추론에 관심이 있다면, 다중 문서 ACID 거래로 가는 우리의 여정에 대해 개략적으로 설명합니다.

MongoDB 4.0은 다중 문서 트랜잭션에 대한 지원을 추가할 것입니다.

https://www.mongodb.com/transactions

기록을 위한 메모입니다.

MongoDB는 트랜잭션을 지원하지 않지만 단일 문서에서 원자성을 지원합니다.

MongoDB는 단일 문서 내에서 원자성 작업을 지원합니다.중첩된 문서에서 제공되는 가능성을 고려할 때, 이 기능은 많은 사용 사례를 지원합니다.

또한 "격리된 작업 시퀀스"에 대한 수동 입력도 흥미로울 수 있습니다.예:

그러나 분리 연산자를 사용하여 여러 문서에 영향을 미치는 단일 쓰기 작업을 분리할 수 있습니다.

대신 MongoDb TokuMX를 사용할 수 있습니다.

http://www.tokutek.com/products/tokumx-for-mongodb/

TokuMXTM은 기본 MongoDB에 비해 성능과 운영 효율성이 획기적으로 향상된 MongoDB의 오픈 소스 고성능 배포판입니다.TokuMX는 MongoDB의 대체 제품으로, 성능이 20배 향상되고 데이터베이스 크기가 90% 감소하며 MVCC와의 ACID 트랜잭션을 지원합니다.

참고로 - 이제 변경되었습니다.

using (var session = mongoDbContext.MongoDatabase.Client.StartSession())
            {
                var itemAuthRepo = (Repository<ItemAuthorization, ObjectId>)mongoDbContext.ItemAuthorizations;
                var calendarRepo = (Repository<CalendarEvent, ObjectId>)mongoDbContext.Calendars;

                if (itemAuthRepo != null && calendarRepo!=null)
                {
                    session.StartTransaction();

                    try
                    {
                        itemAuthRepo.Collection.InsertOne(session, newItemAuthorization);
                        calendarRepo.Collection.InsertOne(session, cal);
                        session.CommitTransaction();
                    }
                    catch (Exception ex)
                    {
                        session.AbortTransaction();
                        throw;
                    }
                }
                else
                {
                    throw new Exception("IRepository was not casted to Repository");
                }
            }

예, 데이터베이스 버전에 따라 MongoDB에 작업 단위 패턴을 적용하는 방법은 여러 가지가 있습니다.

MongoDB 4.0 이전에는 다중 문서 ACID 트랜잭션을 지원하지 않았습니다.그런 다음 개발자들은 "2단계 커밋 프로토콜"(단일 데이터베이스)과 "3단계 커밋 프로토콜"(분산 데이터베이스에서 비차단)을 사용하여 데이터 일관성을 제공하지만 데이터 무결성을 유지하기 위해 전체 또는 아무것도 실행하지 않는 자체 트랜잭션 계층을 생성했습니다.그래서 그 방법은 성능을 떨어뜨렸습니다.

MongoDB 4.0은 다중 문서 ACID 트랜잭션에 대한 지원을 추가했습니다.

출처:

https://en.wikipedia.org/wiki/Two-phase_commit_protocol

https://en.wikipedia.org/wiki/Three-phase_commit_protocol

https://www.mongodb.com/transactions

MongoDB는 버전 4.0 이후의 트랜잭션을 지원하며 버전 4.4 이후부터는 트랜잭션에서 컬렉션을 만드는 것도 지원합니다.

방금 mongoDB 버전 5.0을 사용하는 mongoDB 아틀라스에서 제공하는 무료 클러스터를 사용하여 mongoDB에서 트랜잭션을 활성화하고 테스트했습니다.

mongoDB 버전 4.2+의 경우 다음 설정이 작동해야 하지만 아직 테스트되지 않았습니다.

pom.xml

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.0</version>
</parent>

<properties>
    <java.version>11</java.version>
    <mongodb.version>4.4.0</mongodb.version>
</properties>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
    <version>2.7.0</version>
</dependency>

MongoConfig.java

@Configuration
public class MongoConfig
{
    @Bean
    MongoTransactionManager transactionManager(MongoDatabaseFactory 
    mongoDatabaseFactory)
    {
        return new MongoTransactionManager(mongoDatabaseFactory);
    }
}

그런 다음 트랜잭션을 활성화할 @Transactional on 함수를 추가합니다.

저한테 효과가 있었어요!

언급URL : https://stackoverflow.com/questions/2655251/mongodb-transactions