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")); Listusers = 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")); Listusers = 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.