sql >> データベース >  >> NoSQL >> MongoDB

SpringDataMongoDBトランザクション

    1。概要

    4.0リリース以降、MongoDBはマルチドキュメントACIDトランザクションをサポートします。また、 SpringDataLovelaceがこれらのネイティブMongoDBトランザクションのサポートを提供するようになりました

    このチュートリアルでは、同期トランザクションとリアクティブトランザクションに対するSpringDataMongoDBのサポートについて説明します。

    Spring Data TransactionTemplateも見ていきます。 非ネイティブトランザクションのサポート用。

    このSpringDataモジュールの概要については、紹介記事をご覧ください。

    2。 MongoDB4.0をセットアップする

    まず、新しいネイティブトランザクションのサポートを試すために、最新のMongoDBをセットアップする必要があります。

    開始するには、MongoDBダウンロードセンターから最新バージョンをダウンロードする必要があります。

    次に、 mongodを開始します コマンドラインを使用したサービス:

    mongod --replSet rs0

    最後に、レプリカセットを開始します–まだの場合:

    mongo --eval "rs.initiate()"

    MongoDBは現在、レプリカセットを介したトランザクションをサポートしていることに注意してください。

    3。 Maven構成

    次に、次の依存関係を pom.xmlに追加する必要があります。 :

    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-mongodb</artifactId>
        <version>3.0.3.RELEASE</version>
    </dependency>

    ライブラリの最新リリースは中央リポジトリにあります

    4。 MongoDB構成

    それでは、構成を見てみましょう:

    @Configuration
    @EnableMongoRepositories(basePackages = "com.baeldung.repository")
    public class MongoConfig extends AbstractMongoClientConfiguration{
    
        @Bean
        MongoTransactionManager transactionManager(MongoDatabaseFactory dbFactory) {
            return new MongoTransactionManager(dbFactory);
        }
    
        @Override
        protected String getDatabaseName() {
            return "test";
        }
    
        @Override
        public MongoClient mongoClient() {
            final ConnectionString connectionString = new ConnectionString("mongodb://localhost:27017/test");
            final MongoClientSettings mongoClientSettings = MongoClientSettings.builder()
                .applyConnectionString(connectionString)
                .build();
            return MongoClients.create(mongoClientSettings);
        }
    }

    MongoTransactionManagerを登録する必要があることに注意してください デフォルトで無効になっているネイティブMongoDBトランザクションを有効にする構成で。

    5。同期トランザクション

    構成が完了したら、ネイティブのMongoDBトランザクションを使用するために必要なのは、メソッドに注釈を付けることだけです。 @Transactional

    注釈付きメソッド内のすべてが1つのトランザクションで実行されます:

    @Test
    @Transactional
    public void whenPerformMongoTransaction_thenSuccess() {
        userRepository.save(new User("John", 30));
        userRepository.save(new User("Ringo", 35));
        Query query = new Query().addCriteria(Criteria.where("name").is("John"));
        List<User> users = mongoTemplate.find(query, User.class);
    
        assertThat(users.size(), is(1));
    }

    listCollectionsは使用できないことに注意してください マルチドキュメントトランザクション内のコマンド–例:

    @Test(expected = MongoTransactionException.class)
    @Transactional
    public void whenListCollectionDuringMongoTransaction_thenException() {
        if (mongoTemplate.collectionExists(User.class)) {
            mongoTemplate.save(new User("John", 30));
            mongoTemplate.save(new User("Ringo", 35));
        }
    }

    この例では、 MongoTransactionExceptionがスローされます collectionExists()を使用したため メソッド。

    6。 TransactionTemplate

    SpringDataが新しいMongoDBネイティブトランザクションをどのようにサポートするかを見ました。さらに、SpringDataは非ネイティブオプションも提供します。

    Spring Data TransactionTemplateを使用して非ネイティブトランザクションを実行できます

    @Test
    public void givenTransactionTemplate_whenPerformTransaction_thenSuccess() {
        mongoTemplate.setSessionSynchronization(SessionSynchronization.ALWAYS);                                     
    
        TransactionTemplate transactionTemplate = new TransactionTemplate(mongoTransactionManager);
        transactionTemplate.execute(new TransactionCallbackWithoutResult() {
            @Override
            protected void doInTransactionWithoutResult(TransactionStatus status) {
                mongoTemplate.insert(new User("Kim", 20));
                mongoTemplate.insert(new User("Jack", 45));
            };
        });
    
        Query query = new Query().addCriteria(Criteria.where("name").is("Jack")); 
        List<User> users = mongoTemplate.find(query, User.class);
    
        assertThat(users.size(), is(1));
    }

    SessionSynchronizationを設定する必要があります 常に 非ネイティブのSpringDataトランザクションを使用します。

    7。リアクティブトランザクション

    最後に、MongoDBリアクティブトランザクションのSpringDataサポートについて見ていきます。 。

    pom.xmlにさらにいくつかの依存関係を追加する必要があります リアクティブMongoDBを使用するには:

    <dependency>
        <groupId>org.mongodb</groupId>
        <artifactId>mongodb-driver-reactivestreams</artifactId>
        <version>4.1.0</version>
    </dependency>
    
    <dependency>
        <groupId>org.mongodb</groupId>
        <artifactId>mongodb-driver-sync</artifactId>
        <version>4.0.5</version>
    </dependency>
            
    <dependency>
        <groupId>io.projectreactor</groupId>
        <artifactId>reactor-test</artifactId>
        <version>3.2.0.RELEASE</version>
        <scope>test</scope>
    </dependency>

    mongodb-driver-reactivestreams、mongodb-driver-sync、reactor-testの依存関係は、MavenCentralで利用できます。

    そしてもちろん、Reactive MongoDBを構成する必要があります:

    @Configuration
    @EnableReactiveMongoRepositories(basePackages 
      = "com.baeldung.reactive.repository")
    public class MongoReactiveConfig 
      extends AbstractReactiveMongoConfiguration {
    
        @Override
        public MongoClient reactiveMongoClient() {
            return MongoClients.create();
        }
    
        @Override
        protected String getDatabaseName() {
            return "reactive";
        }
    }

    リアクティブMongoDBでトランザクションを使用するには、 inTransaction()を使用する必要があります ReactiveMongoOperationsのメソッド :

    @Autowired
    private ReactiveMongoOperations reactiveOps;
    
    @Test
    public void whenPerformTransaction_thenSuccess() {
        User user1 = new User("Jane", 23);
        User user2 = new User("John", 34);
        reactiveOps.inTransaction()
          .execute(action -> action.insert(user1)
          .then(action.insert(user2)));
    }

    Spring Dataのリアクティブリポジトリの詳細については、こちらをご覧ください。


    1. GoLangのデータソースとしてMongoDBを使用する

    2. node.jsがモジュール'mongodb'を見つけることができません

    3. NodejsMongoをサブドキュメントに挿入-動的フィールド名

    4. MongoDBシャードクラスターを作成するための3つの簡単なステップ