내용
Spring Data는 Transaction을 지원합니다.
Mongodb도 transaction을 지원합니다.
다만 RDB와 다르게 Spring에서 자동으로 지원해주진 않고 TransactionManager를 만들어야 합니다.
Unless you specify a MongoTransactionManager within your application context, transaction support is DISABLED. You can use setSessionSynchronization(ALWAYS) to participate in ongoing non-native MongoDB transactions.
-
참고 link
- Config
@Configuration static class Config extends AbstractMongoClientConfiguration { @Bean MongoTransactionManager transactionManager(MongoDatabaseFactory dbFactory) { return new MongoTransactionManager(dbFactory); } }
- Service
@Component public class StateService { @Transactional void someBusinessFunction(Step step) { template.insert(step); process(step); template.update(Step.class).apply(Update.set("state", // ... }; });
다만 Transaction을 사용하려면 특별한 조건이 필요합니다.
만약 코드를 사용하려고 시도할때 다음과 같은 에러를 확인할 수 있습니다.
com.mongodb.MongoCommandException: Command failed with error 263 (...): 'Transaction numbers are only allowed on a replica set member or mongos' on server localhost:27017.
The full response is { "ok" : 0.0, "errmsg" : "Transaction numbers are only allowed on a replica set member or mongos", "code" : 263, "codeName" : "..." }
Transaction numbers are only allowed on a replica set member or mongos
Transaction을 사용하려면 mongodb가 replica set으로 구성되어있어야 합니다.