Tavaszi adatok MongoDB tranzakciók

1. Áttekintés

A 4.0 kiadástól kezdve a MongoDB támogatja a több dokumentumot tartalmazó ACID tranzakciókat. És, A Spring Data Lovelace mostantól támogatja ezeket a natív MongoDB tranzakciókat.

Ebben az oktatóanyagban megvitatjuk a Spring Data MongoDB támogatását a szinkron és reaktív tranzakciókhoz.

Megnézzük a Spring Data-t is TransactionTemplate nem natív tranzakciók támogatása.

A Spring Data modul bevezetéséhez tekintse meg a bevezető írásunkat.

2. A MongoDB 4.0 telepítése

Először be kell állítanunk a legújabb MongoDB-t az új natív tranzakciók támogatásának kipróbálására.

A kezdéshez le kell töltenünk a legújabb verziót a MongoDB letöltő központból.

Ezután kezdjük mongód szolgáltatás a parancssor segítségével:

mongod --replSet rs0

Végül indítsa el a replikaszettet - ha még nem:

mongo --eval "rs.initiate ()"

Ne feledje, hogy a MongoDB jelenleg replikakészleten keresztüli tranzakciókat támogat.

3. Maven konfiguráció

Ezután hozzá kell adnunk a következő függőségeket a sajátunkhoz pom.xml:

 org.springframework.data spring-data-mongodb 3.0.3.KÖZLEMÉNY 

A könyvtár legújabb kiadása megtalálható a központi adattárban

4. MongoDB konfiguráció

Most nézzük meg a konfigurációnkat:

@Configuration @EnableMongoRepositories (basePackages = "com.baeldung.repository") public class MongoConfig kiterjeszti az AbstractMongoClientConfiguration {@Bean MongoTransactionManageractionManager (MongoDatabaseFactory dbFactory) db {return new Mongo } @Orride védett karakterlánc getDatabaseName () {return "teszt"; } @Orride public MongoClient mongoClient () {final ConnectionString connectionString = new ConnectionString ("mongodb: // localhost: 27017 / test"); final MongoClientSettings mongoClientSettings = MongoClientSettings.builder () .applyConnectionString (connectionString) .build (); return MongoClients.create (mongoClientSettings); }}

Vegye figyelembe, hogy regisztrálnunk kell MongoTransactionManager konfigurációnkban engedélyezzük a natív MongoDB tranzakciókat, mivel azok alapértelmezés szerint le vannak tiltva.

5. Szinkron tranzakciók

Miután befejeztük a konfigurációt, csak a natív MongoDB tranzakciók használatához kell tennünk jelölje meg módszerünket azzal @ Tranzakció.

Az annotált módszeren belül mindent egy tranzakcióval hajtanak végre:

@Test @Transactional public void whenPerformMongoTransaction_thenSuccess () {userRepository.save (new User ("John", 30)); userRepository.save (új felhasználó ("Ringo", 35)); Lekérdezés = új Lekérdezés (). AddCriteria (Criteria.where ("név"). Is ("John")); Felhasználók listája = mongoTemplate.find (lekérdezés, Felhasználó.osztály); assertThat (users.size (), az (1)); }

Vegye figyelembe, hogy nem tudjuk használni listCollections parancs egy több dokumentumot tartalmazó tranzakción belül - például:

@Test (várható = MongoTransactionException.class) @Transactional public void whenListCollectionDuringMongoTransaction_thenException () {if (mongoTemplate.collectionExists (User.class)) {mongoTemplate.save (új felhasználó ("John", 30)); mongoTemplate.save (új felhasználó ("Ringo", 35)); }}

Ez a példa a MongoTransactionException ahogy használtuk a collectionExists () módszer.

6. TransactionTemplate

Láttuk, hogy a Spring Data miként támogatja az új MongoDB natív tranzakciókat. Ezenkívül a Spring Data a nem natív lehetőséget is biztosítja.

Nem natív tranzakciókat hajthatunk végre a Spring Data segítségével TransactionTemplate:

@Test public void givenTransactionTemplate_whenPerformTransaction_thenSuccess () {mongoTemplate.setSessionSynchronization (SessionSynchronization.ALWAYS); TransactionTemplateactionTemplate = új TransactionTemplate (mongoTransactionManager); actionTemplate.execute (new TransactionCallbackWithoutResult () {@Orride protected void doInTransactionWithoutResult (TransactionStatus status) {mongoTemplate.insert (new User ("Kim", 20)); mongoTemplate.insert (new User ("Jack", 45));} ;}); Lekérdezés = új lekérdezés (). AddCriteria (Criteria.where ("név"). Is ("Jack")); Felhasználók listája = mongoTemplate.find (lekérdezés, Felhasználó.osztály); assertThat (users.size (), az (1)); }

Be kell állítanunk SessionSynchronization nak nek MINDIG nem natív Spring Data tranzakciók használatához.

7. Reaktív tranzakciók

Végül megnézzük Spring Data támogatás a MongoDB reaktív tranzakciókhoz.

Hozzá kell adnunk még néhány függőséget a pom.xml reaktív MongoDB-vel dolgozni:

 org.mongodb mongodb-driver-reactivestreams 4.1.0 org.mongodb mongodb-driver-sync 4.0.5 io.projectreactor reaktor-teszt 3.2.0.KÖZLÍTÉSI teszt 

A mongodb-driver-reaktiv streamek, a mongodb-driver-sync és a reaktor-teszt függőségek a Maven Centralon érhetők el.

És természetesen konfigurálnunk kell a Reaktív MongoDB-t:

@Configuration @EnableReactiveMongoRepositories (basePackages = "com.baeldung.reactive.repository") public class MongoReactiveConfig extends AbstractReactiveMongoConfiguration {@Override public MongoClient reactiveMongoCreate () {return Mumbo } @Orride védett karakterlánc getDatabaseName () {return "reaktív"; }}

A reaktív MongoDB-ben történő tranzakciók használatához a inTransaction () módszer ben ReactiveMongoOperations:

@Autowired private ReactiveMongoOperations reactiveOps; @Test public void whenPerformTransaction_thenSuccess () {User user1 = new User ("Jane", 23); User2 = új felhasználó ("John", 34); reaktívOps.inTransaction () .execute (action -> action.insert (user1) .then (action.insert (user2))); }

További információ a Spring Data reaktív adattárairól itt érhető el.

8. Következtetés

Ebben az írásban megtanultuk a natív és nem natív MongoDB tranzakciók használatát a Spring Data segítségével.

A példák teljes forráskódja elérhető a GitHub oldalon.