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.