Vårdata MongoDB-transaksjoner

1. Oversikt

Fra og med 4.0-utgivelsen støtter MongoDB multi-document ACID-transaksjoner. Og, Spring Data Lovelace gir nå støtte for disse innfødte MongoDB-transaksjonene.

I denne veiledningen vil vi diskutere Spring Data MongoDB-støtte for synkrone og reaktive transaksjoner.

Vi tar også en titt på Spring Data TransactionTemplate for ikke-innfødte transaksjoner støtte.

For en introduksjon til denne vårdatamodulen, ta en titt på vår innledende skriving.

2. Konfigurer MongoDB 4.0

Først må vi konfigurere nyeste MongoDB for å prøve den nye innfødte transaksjonstøtten.

For å komme i gang må vi laste ned den nyeste versjonen fra MongoDB Download Center.

Deretter begynner vi mongod tjeneste ved hjelp av kommandolinjen:

mongod --replSet rs0

Til slutt, start replikasett - hvis ikke allerede:

mongo --eval "rs.initiate ()"

Merk at MongoDB for øyeblikket støtter transaksjoner over et replikasett.

3. Maven-konfigurasjon

Deretter må vi legge til følgende avhengigheter i vår pom.xml:

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

Den siste utgivelsen av biblioteket finner du på Central Repository

4. MongoDB-konfigurasjon

La oss ta en titt på konfigurasjonen vår:

@Configuration @EnableMongoRepositories (basePackages = "com.baeldung.repository") offentlig klasse MongoConfig utvider AbstractMongoClientConfiguration {@Bean MongoTransactionManager transactionManager (MongoDatabaseFactory dbFactory) {returner nye MongoTransactionManager; } @ Override-beskyttet streng getDatabaseName () {returner "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 må registrere oss MongoTransactionManager i vår konfigurasjon for å aktivere native MongoDB-transaksjoner ettersom de er deaktivert som standard.

5. Synkrontransaksjoner

Etter at vi er ferdig med konfigurasjonen, er alt vi trenger å gjøre for å bruke innfødte MongoDB-transaksjoner kommentere metoden vår med @Transaksjonell.

Alt i den merkede metoden vil bli utført i en transaksjon:

@Test @Transactional public void whenPerformMongoTransaction_thenSuccess () {userRepository.save (ny bruker ("John", 30)); userRepository.save (ny bruker ("Ringo", 35)); Query query = new Query (). AddCriteria (Criteria.where ("name"). Is ("John")); Liste brukere = mongoTemplate.find (spørring, User.class); assertThat (users.size (), er (1)); }

Merk at vi ikke kan bruke listCollections kommando i en multi-dokument transaksjon - for eksempel:

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

Dette eksemplet kaster a MongoTransactionException som vi brukte collectionExists () metode.

6. TransactionTemplate

Vi så hvordan Spring Data støtter ny MongoDB native-transaksjon. I tillegg gir Spring Data også alternativet som ikke er hjemmehørende.

Vi kan utføre ikke-innfødte transaksjoner ved hjelp av Spring Data TransactionTemplate:

@Test offentlig ugyldighet gittTransactionTemplate_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));} ;}); Query query = new Query (). AddCriteria (Criteria.where ("name"). Is ("Jack")); Liste brukere = mongoTemplate.find (spørring, User.class); assertThat (users.size (), er (1)); }

Vi må sette SessionSynchronization til ALLTID å bruke ikke-opprinnelige vårdata-transaksjoner.

7. Reaktive transaksjoner

Til slutt tar vi en titt på Vårdatastøtte for MongoDB reaktive transaksjoner.

Vi må legge til noen flere avhengigheter til pom.xml å jobbe med reaktivt 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 

Avhengighetene av mongodb-driver-reactivestreams, mongodb-driver-sync og reaktortest er tilgjengelige på Maven Central.

Og selvfølgelig må vi konfigurere vår reaktive MongoDB:

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

For å bruke transaksjoner i reaktivt MongoDB, må vi bruke inTransaction () metode i ReactiveMongoOperations:

@Autowired private ReactiveMongoOperations reactiveOps; @Test offentlig ugyldig nårPerformTransaction_thenSuccess () {User user1 = new User ("Jane", 23); Bruker bruker2 = ny bruker ("John", 34); reactiveOps.inTransaction () .execute (action -> action.insert (user1) .then (action.insert (user2))); }

Mer informasjon om reaktive arkiver i Spring Data er tilgjengelig her.

8. Konklusjon

I denne oppskriften lærte vi hvordan vi bruker innfødte og ikke-innfødte MongoDB-transaksjoner ved hjelp av Spring Data.

Den fullstendige kildekoden for eksemplene er tilgjengelig på GitHub.


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