Jarné transakcie s údajmi MongoDB

1. Prehľad

Počnúc vydaním 4.0 podporuje MongoDB transakcie ACID s viacerými dokumentmi. A Spring Data Lovelace teraz poskytuje podporu pre tieto natívne transakcie MongoDB.

V tomto výučbe sa budeme zaoberať podporou Spring Data MongoDB pre synchrónne a reaktívne transakcie.

Taktiež sa pozrieme na Spring Data TransactionTemplate pre podporu natívnych transakcií.

Úvod do tohto modulu jarných údajov nájdete v našom úvodnom zápise.

2. Inštalácia MongoDB 4.0

Najskôr budeme musieť nastaviť najnovšiu MongoDB, aby sme vyskúšali novú podporu natívnych transakcií.

Na začiatok si musíme stiahnuť najnovšiu verziu z MongoDB Download Center.

Ďalej začneme mongod služba pomocou príkazového riadku:

mongod --replSet rs0

Nakoniec spustite sadu replík - ak ešte nie:

mongo --eval "rs.initiate ()"

Upozorňujeme, že server MongoDB v súčasnosti podporuje transakcie cez množinu replík.

3. Konfigurácia Maven

Ďalej musíme do našej pridať nasledujúce závislosti pom.xml:

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

Posledné vydanie knižnice nájdete v centrálnom úložisku

4. Konfigurácia MongoDB

Poďme sa teraz pozrieť na našu konfiguráciu:

@Configuration @EnableMongoRepositories (basePackages = "com.baeldung.repository") verejná trieda MongoConfig rozširuje AbstractMongoClientConfiguration {@Bean MongoTransactionManager transactionManager (MongoDatabaseFactory dbFactory) {návrat nového MongoTransactionManager (dbF) } @Override chránený reťazec getDatabaseName () {return "test"; } @Override public MongoClient mongoClient () {final ConnectionString connectionString = nový ConnectionString ("mongodb: // localhost: 27017 / test"); final MongoClientSettings mongoClientSettings = MongoClientSettings.builder () .applyConnectionString (connectionString) .build (); návrat MongoClients.create (mongoClientSettings); }}

Poznač si to musíme sa zaregistrovať MongoTransactionManager v našej konfigurácii povoliť natívne transakcie MongoDB, pretože sú predvolene zakázané.

5. Synchrónne transakcie

Po dokončení konfigurácie všetko, čo musíme urobiť, aby sme mohli používať natívne transakcie MongoDB - je anotovať našu metódu pomocou @ Transakčné.

Všetko vo vnútri anotovanej metódy sa vykoná v jednej transakcii:

@Test @Transactional public void whenPerformMongoTransaction_thenSuccess () {userRepository.save (nový používateľ ("John", 30)); userRepository.save (nový užívateľ ("Ringo", 35)); Dotaz na dopyt = nový dotaz (). AddCriteria (Criteria.where ("meno"). Je ("John")); Zoznam používateľov = mongoTemplate.find (dopyt, User.class); assertThat (users.size (), je (1)); }

Upozorňujeme, že nemôžeme použiť listCollections príkaz vo vnútri transakcie s viacerými dokumentmi - napríklad:

@Test (očakáva sa = MongoTransactionException.class) @Transactional public void whenListCollectionDuringMongoTransaction_thenException () {if (mongoTemplate.collectionExists (User.class)) {mongoTemplate.save (new User ("John", 30)); mongoTemplate.save (nový používateľ ("Ringo", 35)); }}

Tento príklad vyvolá a MongoTransactionException ako sme použili zbierkaExistuje () metóda.

6. TransactionTemplate

Videli sme, ako Spring Data podporujú nové natívne transakcie MongoDB. Spring Data navyše poskytuje aj nie natívnu možnosť.

Neprirodzené transakcie môžeme vykonávať pomocou Spring Data TransactionTemplate:

@Test public void givenTransactionTemplate_whenPerformTransaction_thenSuccess () {mongoTemplate.setSessionSynchronization (SessionSynchronization.ALWAYS); TransactionTemplate transactionTemplate = nový TransactionTemplate (mongoTransactionManager); transactionTemplate.execute (new TransactionCallbackWithoutResult () {@Override protected void doInTransactionWithoutResult (stav TransactionStatus) {mongoTemplate.insert (nový používateľ ("Kim", 20)); mongoTemplate.insert (nový používateľ ("Jack", 45));} ;}); Dotaz na dopyt = nový dotaz (). AddCriteria (Criteria.where ("meno"). Je ("Jack")); Zoznam používateľov = mongoTemplate.find (dopyt, User.class); assertThat (users.size (), je (1)); }

Musíme nastaviť SessionSynchronization do VŽDY používať natívne transakcie jarných údajov.

7. Reaktívne transakcie

Nakoniec sa pozrieme na Jarná podpora dát pre reaktívne transakcie MongoDB.

Budeme musieť pridať niekoľko ďalších závislostí do pom.xml pracovať s reaktívnym 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 

Závislosti MongoDB-Driver-Reactivestream, MongoDB-Driver-Sync a Reactor-Test sú k dispozícii na serveri Maven Central.

A samozrejme musíme nakonfigurovať náš Reactive MongoDB:

@Configuration @EnableReactiveMongoRepositories (basePackages = "com.baeldung.reactive.repository") verejná trieda MongoReactiveConfig rozširuje AbstractReactiveMongoConfiguration {@Override public MongoClient reactiveMongoClient () {return MongoClients.create () } @Override chránený reťazec getDatabaseName () {návrat "reaktívny"; }}

Na použitie transakcií v reaktívnom MongoDB je potrebné použiť inTransaction () metóda v ReactiveMongoOperations:

@Autowired private ReactiveMongoOperations reactiveOps; @ Test public void whenPerformTransaction_thenSuccess () {Používateľ user1 = nový Používateľ ("Jane", 23); Používateľ user2 = nový používateľ ("John", 34); reactiveOps.inTransaction () .execute (action -> action.insert (user1) .then (action.insert (user2))); }

Viac informácií o reaktívnych úložiskách v Spring Data je k dispozícii tu.

8. Záver

V tomto zápise sme sa naučili, ako používať natívne a nepôvodné transakcie MongoDB pomocou Spring Data.

Celý zdrojový kód príkladov je k dispozícii na GitHub.


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