Spring Data MongoDB-transacties

1. Overzicht

Vanaf release 4.0 ondersteunt MongoDB ACID-transacties met meerdere documenten. En, Spring Data Lovelace biedt nu ondersteuning voor deze native MongoDB-transacties.

In deze zelfstudie bespreken we Spring Data MongoDB-ondersteuning voor synchrone en reactieve transacties.

We zullen ook Spring Data bekijken Transactietemplate voor ondersteuning van niet-native transacties.

Bekijk ons ‚Äč‚Äčinleidende artikel voor een inleiding tot deze Spring Data-module.

2. Stel MongoDB 4.0 in

Eerst moeten we de nieuwste MongoDB instellen om de nieuwe ondersteuning voor native transacties te proberen.

Om te beginnen, moeten we de nieuwste versie downloaden van het MongoDB Download Center.

Vervolgens beginnen we Mongod service met behulp van de opdrachtregel:

mongod --replSet rs0

Start ten slotte de replicaset - als dit nog niet het geval is:

mongo --eval "rs.initiate ()"

Merk op dat MongoDB momenteel transacties via een replicaset ondersteunt.

3. Maven-configuratie

Vervolgens moeten we de volgende afhankelijkheden toevoegen aan onze pom.xml:

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

De laatste release van de bibliotheek is te vinden op de Central Repository

4. MongoDB-configuratie

Laten we nu eens kijken naar onze configuratie:

@Configuration @EnableMongoRepositories (basePackages = "com.baeldung.repository") openbare klasse MongoConfig breidt AbstractMongoClientConfiguration uit {@Bean MongoTransactionManager transactionManager (MongoDatabaseFactory dbFactory) {retourneer nieuwe MongoTransactionManager); ( } @Override beschermde String getDatabaseName () {retourneer "test"; } @Override openbare MongoClient mongoClient () {final ConnectionString connectionString = nieuwe ConnectionString ("mongodb: // localhost: 27017 / test"); laatste MongoClientSettings mongoClientSettings = MongoClientSettings.builder () .applyConnectionString (connectionString) .build (); retourneer MongoClients.create (mongoClientSettings); }}

Let daar op we moeten ons registreren MongoTransactionManager in onze configuratie om native MongoDB-transacties in te schakelen, aangezien deze standaard zijn uitgeschakeld.

5. Synchrone transacties

Nadat we de configuratie hebben voltooid, hoeven we alleen nog maar native MongoDB-transacties te gebruiken annoteer onze methode met @Transactional.

Alles binnen de geannoteerde methode wordt in één transactie uitgevoerd:

@Test @Transactional public void whenPerformMongoTransaction_thenSuccess () {userRepository.save (nieuwe gebruiker ("John", 30)); userRepository.save (nieuwe gebruiker ("Ringo", 35)); Queryquery = nieuwe Query (). AddCriteria (Criteria.where ("name"). Is ("John")); Lijst gebruikers = mongoTemplate.find (query, User.class); assertThat (users.size (), is (1)); }

Merk op dat we niet kunnen gebruiken listCollections commando binnen een transactie met meerdere documenten - bijvoorbeeld:

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

Dit voorbeeld gooit een MongoTransactionException zoals we de collectionExists () methode.

6. Transactietemplate

We hebben gezien hoe Spring Data de nieuwe native MongoDB-transactie ondersteunt. Bovendien biedt Spring Data ook de niet-native optie.

We kunnen niet-native transacties uitvoeren met Spring Data Transactietemplate:

@Test openbare ongeldig gegevenTransactionTemplate_whenPerformTransaction_thenSuccess () {mongoTemplate.setSessionSynchronization (SessionSynchronization.ALWAYS); TransactionTemplate transactionTemplate = nieuwe TransactionTemplate (mongoTransactionManager); transactionTemplate.execute (nieuwe TransactionCallbackWithoutResult () {@Override beschermd ongeldig doInTransactionWithoutResult (TransactionStatus status) {mongoTemplate.insert (nieuwe gebruiker ("Kim", 20)); mongoTemplate.insert (nieuwe gebruiker ("Jack", 45));} ;}); Queryquery = nieuwe Query (). AddCriteria (Criteria.where ("naam"). Is ("Jack")); Lijst gebruikers = mongoTemplate.find (query, User.class); assertThat (users.size (), is (1)); }

We moeten gaan SessionSynchronisatie naar ALTIJD om niet-native Spring Data-transacties te gebruiken.

7. Reactieve transacties

Ten slotte bekijken we Spring Data-ondersteuning voor reactieve MongoDB-transacties.

We zullen nog een paar afhankelijkheden moeten toevoegen aan het pom.xml werken met reactieve 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 

De afhankelijkheden mongodb-driver-reactivestreams, mongodb-driver-sync en reactor-test zijn beschikbaar op Maven Central.

En natuurlijk moeten we onze Reactive MongoDB configureren:

@Configuration @EnableReactiveMongoRepositories (basePackages = "com.baeldung.reactive.repository") openbare klasse MongoReactiveConfig breidt AbstractReactiveMongoConfiguration uit {@Override openbare MongoClient reactiveMongoClient () {returno MongoClient () {returnoClients () {returnoClients (); } @Override beschermde String getDatabaseName () {retourneer "reactief"; }}

Om transacties in reactieve MongoDB te gebruiken, moeten we de inTransactie () methode in ReactiveMongoOperations:

@Autowired privé ReactiveMongoOperations reactiveOps; @Test public void whenPerformTransaction_thenSuccess () {User user1 = nieuwe gebruiker ("Jane", 23); Gebruiker user2 = nieuwe gebruiker ("Jan", 34); reactiveOps.inTransaction () .execute (action -> action.insert (user1) .then (action.insert (user2))); }

Meer informatie over reactieve repositories in Spring Data is hier beschikbaar.

8. Conclusie

In dit artikel hebben we geleerd hoe we native en niet-native MongoDB-transacties kunnen gebruiken met Spring Data.

De volledige broncode voor de voorbeelden is beschikbaar op GitHub.