1。概要
4.0リリース以降、MongoDBはマルチドキュメントACIDトランザクションをサポートします。また、 SpringDataLovelaceがこれらのネイティブMongoDBトランザクションのサポートを提供するようになりました 。
このチュートリアルでは、同期トランザクションとリアクティブトランザクションに対するSpringDataMongoDBのサポートについて説明します。
Spring Data TransactionTemplateも見ていきます。 非ネイティブトランザクションのサポート用。
このSpringDataモジュールの概要については、紹介記事をご覧ください。
2。 MongoDB4.0をセットアップする
まず、新しいネイティブトランザクションのサポートを試すために、最新のMongoDBをセットアップする必要があります。
開始するには、MongoDBダウンロードセンターから最新バージョンをダウンロードする必要があります。
次に、 mongodを開始します コマンドラインを使用したサービス:
mongod --replSet rs0
最後に、レプリカセットを開始します–まだの場合:
mongo --eval "rs.initiate()"
MongoDBは現在、レプリカセットを介したトランザクションをサポートしていることに注意してください。
3。 Maven構成
次に、次の依存関係を pom.xmlに追加する必要があります。 :
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>3.0.3.RELEASE</version>
</dependency>
ライブラリの最新リリースは中央リポジトリにあります
4。 MongoDB構成
それでは、構成を見てみましょう:
@Configuration
@EnableMongoRepositories(basePackages = "com.baeldung.repository")
public class MongoConfig extends AbstractMongoClientConfiguration{
@Bean
MongoTransactionManager transactionManager(MongoDatabaseFactory dbFactory) {
return new MongoTransactionManager(dbFactory);
}
@Override
protected String getDatabaseName() {
return "test";
}
@Override
public MongoClient mongoClient() {
final ConnectionString connectionString = new ConnectionString("mongodb://localhost:27017/test");
final MongoClientSettings mongoClientSettings = MongoClientSettings.builder()
.applyConnectionString(connectionString)
.build();
return MongoClients.create(mongoClientSettings);
}
}
MongoTransactionManagerを登録する必要があることに注意してください デフォルトで無効になっているネイティブMongoDBトランザクションを有効にする構成で。
5。同期トランザクション
構成が完了したら、ネイティブのMongoDBトランザクションを使用するために必要なのは、メソッドに注釈を付けることだけです。 @Transactional 。
注釈付きメソッド内のすべてが1つのトランザクションで実行されます:
@Test
@Transactional
public void whenPerformMongoTransaction_thenSuccess() {
userRepository.save(new User("John", 30));
userRepository.save(new User("Ringo", 35));
Query query = new Query().addCriteria(Criteria.where("name").is("John"));
List<User> users = mongoTemplate.find(query, User.class);
assertThat(users.size(), is(1));
}
listCollectionsは使用できないことに注意してください マルチドキュメントトランザクション内のコマンド–例:
@Test(expected = MongoTransactionException.class)
@Transactional
public void whenListCollectionDuringMongoTransaction_thenException() {
if (mongoTemplate.collectionExists(User.class)) {
mongoTemplate.save(new User("John", 30));
mongoTemplate.save(new User("Ringo", 35));
}
}
この例では、 MongoTransactionExceptionがスローされます collectionExists()を使用したため メソッド。
6。 TransactionTemplate
SpringDataが新しいMongoDBネイティブトランザクションをどのようにサポートするかを見ました。さらに、SpringDataは非ネイティブオプションも提供します。
Spring Data TransactionTemplateを使用して非ネイティブトランザクションを実行できます :
@Test
public void givenTransactionTemplate_whenPerformTransaction_thenSuccess() {
mongoTemplate.setSessionSynchronization(SessionSynchronization.ALWAYS);
TransactionTemplate transactionTemplate = new 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"));
List<User> users = mongoTemplate.find(query, User.class);
assertThat(users.size(), is(1));
}
SessionSynchronizationを設定する必要があります 常に 非ネイティブのSpringDataトランザクションを使用します。
7。リアクティブトランザクション
最後に、MongoDBリアクティブトランザクションのSpringDataサポートについて見ていきます。 。
pom.xmlにさらにいくつかの依存関係を追加する必要があります リアクティブMongoDBを使用するには:
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver-reactivestreams</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver-sync</artifactId>
<version>4.0.5</version>
</dependency>
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-test</artifactId>
<version>3.2.0.RELEASE</version>
<scope>test</scope>
</dependency>
mongodb-driver-reactivestreams、mongodb-driver-sync、reactor-testの依存関係は、MavenCentralで利用できます。
そしてもちろん、Reactive MongoDBを構成する必要があります:
@Configuration
@EnableReactiveMongoRepositories(basePackages
= "com.baeldung.reactive.repository")
public class MongoReactiveConfig
extends AbstractReactiveMongoConfiguration {
@Override
public MongoClient reactiveMongoClient() {
return MongoClients.create();
}
@Override
protected String getDatabaseName() {
return "reactive";
}
}
リアクティブMongoDBでトランザクションを使用するには、 inTransaction()を使用する必要があります ReactiveMongoOperationsのメソッド :
@Autowired
private ReactiveMongoOperations reactiveOps;
@Test
public void whenPerformTransaction_thenSuccess() {
User user1 = new User("Jane", 23);
User user2 = new User("John", 34);
reactiveOps.inTransaction()
.execute(action -> action.insert(user1)
.then(action.insert(user2)));
}
Spring Dataのリアクティブリポジトリの詳細については、こちらをご覧ください。