Spring Data MongoDB Transaktioner

1. Oversigt

Fra og med 4.0-udgivelsen understøtter MongoDB ACID-transaktioner med flere dokumenter. Og, Spring Data Lovelace yder nu support til disse native MongoDB-transaktioner.

I denne vejledning diskuterer vi Spring Data MongoDB-understøttelse af synkrone og reaktive transaktioner.

Vi kigger også på Spring Data Transaktionsskabelon til ikke-indfødte transaktioner support.

For en introduktion til dette Spring Data-modul, se på vores indledende skrivning.

2. Opsæt MongoDB 4.0

Først skal vi konfigurere den nyeste MongoDB for at prøve den nye native-transaktionsunderstøttelse.

For at komme i gang skal vi downloade den nyeste version fra MongoDB Download Center.

Derefter starter vi mongod service ved hjælp af kommandolinjen:

mongod --replSet rs0

Endelig, start replika-sæt - hvis ikke allerede:

mongo --eval "rs.initiate ()"

Bemærk, at MongoDB i øjeblikket understøtter transaktioner via et replikasæt.

3. Maven-konfiguration

Dernæst skal vi tilføje følgende afhængigheder til vores pom.xml:

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

Den seneste udgivelse af biblioteket findes i Central Repository

4. MongoDB-konfiguration

Lad os nu se på vores konfiguration:

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

Noter det vi skal registrere MongoTransactionManager i vores konfiguration for at aktivere native MongoDB-transaktioner, da de er deaktiveret som standard.

5. Synkrontransaktioner

Når vi er færdige med konfigurationen, er alt, hvad vi skal gøre for at bruge native MongoDB-transaktioner - at kommentere vores metode med @Transaktionel.

Alt inden i den annoterede metode udføres i en transaktion:

@Test @Transactional public void whenPerformMongoTransaction_thenSuccess () {userRepository.save (ny bruger ("John", 30)); userRepository.save (ny bruger ("Ringo", 35)); Forespørgsel = ny forespørgsel (). AddCriteria (Criteria.where ("navn"). Er ("John")); Liste brugere = mongoTemplate.find (forespørgsel, User.class); assertThat (users.size (), er (1)); }

Bemærk, at vi ikke kan bruge listCollections kommando inde i en transaktion med flere dokumenter - for eksempel:

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

Dette eksempel kaster en MongoTransactionException som vi brugte collectionExists () metode.

6. Transaktionsskabelon

Vi så, hvordan Spring Data understøtter den nye MongoDB native-transaktion. Derudover giver Spring Data også den ikke-native mulighed.

Vi kan udføre ikke-native transaktioner ved hjælp af Spring Data Transaktionsskabelon:

@Test offentlig ugyldighed givenTransactionTemplate_whenPerformTransaction_thenSuccess () {mongoTemplate.setSessionSynchronization (SessionSynchronization.ALWAYS); TransactionTemplate transactionTemplate = ny TransactionTemplate (mongoTransactionManager); transactionTemplate.execute (new TransactionCallbackWithoutResult () {@Override protected void doInTransactionWithoutResult (TransactionStatus status) {mongoTemplate.insert (new User ("Kim", 20)); mongoTemplate.insert (new User ("Jack", 45));} ;}); Forespørgsel = ny forespørgsel (). AddCriteria (Criteria.where ("navn"). Er ("Jack")); Liste brugere = mongoTemplate.find (forespørgsel, User.class); assertThat (users.size (), er (1)); }

Vi er nødt til at sætte SessionSynchronization til ALTID at bruge ikke-oprindelige Spring Data-transaktioner.

7. Reaktive transaktioner

Endelig skal vi se på Spring Data support til MongoDB reaktive transaktioner.

Vi bliver nødt til at tilføje et par flere afhængigheder til pom.xml at arbejde med reaktivt MongoDB:

 org.mongodb mongodb-driver-reactivestreams 4.1.0 org.mongodb mongodb-driver-sync 4.0.5 io.projektreaktor reaktortest 3.2.0.RELEASE test 

Mongodb-driver-reactivestreams, mongodb-driver-sync og reactor-test afhængigheder er tilgængelige på Maven Central.

Og selvfølgelig skal vi konfigurere vores reaktive MongoDB:

@Configuration @EnableReactiveMongoRepositories (basePackages = "com.baeldung.reactive.repository") offentlig klasse MongoReactiveConfig udvider AbstractReactiveMongoConfiguration {@Override public MongoClient reactiveMongoClient () {return MongoClients.c; } @ Override-beskyttet streng getDatabaseName () {returner "reaktiv"; }}

For at bruge transaktioner i reaktivt MongoDB skal vi bruge inTransaction () metode i ReactiveMongoOperations:

@Autowired private ReactiveMongoOperations reactiveOps; @Test offentlig ugyldigt nårPerformTransaction_thenSuccess () {Bruger bruger1 = ny bruger ("Jane", 23); Brugerbruger2 = ny bruger ("John", 34); reactiveOps.inTransaction () .execute (action -> action.insert (user1) .then (action.insert (user2))); }

Flere oplysninger om reaktive opbevaringssteder i Spring Data er tilgængelige her.

8. Konklusion

I denne opskrivning lærte vi, hvordan man bruger native og ikke-native MongoDB-transaktioner ved hjælp af Spring Data.

Den fulde kildekode til eksemplerne er tilgængelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found