Рубрики
Без рубрики

Весенние данные МонгоДБ Транзакции

Узнайте о поддержке транзакций в Spring Data MongoDB

Автор оригинала: baeldung.

1. Обзор

Начиная с выпуска 4.0, MongoDB поддерживает много документы ACID транзакций. И, Spring Data Lovelace теперь обеспечивает поддержку этих родных транзакций MongoDB .

В этом учебнике мы обсудим поддержку Spring Data MongoDB для синхронных и реактивных транзакций.

Мы также посмотрим на весенние данные ТранзакцияТемпле для поддержки транзакций, не являяся коренными жителями.

Для введения в этот модуль весенних данных, посмотрите на нашу вступительную записи .

2. Настройка MongoDB 4.0

Во-первых, нам нужно настроить новейший MongoDB, чтобы попробовать поддержку новых родных транзакций.

Чтобы начать работу, мы должны скачать последнюю версию из MongoDB Скачать центр .

Далее, мы начнем мангод служба с использованием командной строки:

mongod --replSet rs0

Наконец, инициировать набор реплик – если не уже:

mongo --eval "rs.initiate()"

Обратите внимание, что MongoDB в настоящее время поддерживает транзакции по набору реплик.

3. Конфигурация Maven

Далее, мы должны добавить следующие зависимости к нашей пом.xml :


    org.springframework.data
    spring-data-mongodb
    3.0.3.RELEASE

Последний релиз библиотеки можно найти на Центральный репозиторий

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);
    }
}

Обратите внимание, что мы должны зарегистрировать МонгоТрансакцияМенагер в нашей конфигурации, чтобы включить родные транзакции MongoDB, поскольку они отключены по умолчанию.

5. Синхронные транзакции

После того, как мы закончили конфигурацию, все, что нам нужно сделать, чтобы использовать родные транзакции MongoDB – это аннотировать наш метод с @Transactional .

Все внутри аннотированного метода будет выполнено в одной транзакции:

@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 users = mongoTemplate.find(query, User.class);

    assertThat(users.size(), is(1));
}

Обратите внимание, что мы не можем использовать списокКоллекции команда внутри мульти-документной транзакции – например:

@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 как мы использовали коллекцияЭксисты () метод.

6. ТранзакцияТемпле

Мы видели, как Spring Data поддерживает новую транзакцию MongoDB. Кроме того, Spring Data также предоставляет не родной вариант.

Мы можем выполнять транзакции, не являемся родными, используя Spring Data ТранзакцияТемпле :

@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 users = mongoTemplate.find(query, User.class);

    assertThat(users.size(), is(1));
}

Мы должны установить СессияСинхронизация ВСЕГДА для использования неродных транзакций Spring Data.

7. Реактивные транзакции

Наконец, мы посмотрим на Поддержка весенних данных для реактивных транзакций MongoDB .

Нам нужно добавить еще несколько зависимостей к пом.xml для работы с реактивным MongoDB:


    org.mongodb
    mongodb-driver-reactivestreams
    4.1.0



    org.mongodb
    mongodb-driver-sync
    4.0.5

        

    io.projectreactor
    reactor-test
    3.2.0.RELEASE
    test

mongodb-драйвер-реактивные потоки , mongodb-драйвер-синхронизация и реактор-испытательный зависимости доступны на Maven Central.

И, конечно, мы должны настроить наш реактивный 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 () метод в РеактивныеМонгуперации :

@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)));
}

Более подробная информация о реактивных репозиториях в весенних данных доступна здесь .

8. Заключение

В этой записи мы узнали, как использовать родных и неродных транзакций MongoDB с помощью Spring Data.

Полный исходный код для примеров доступен более чем на GitHub.