Versión Spring Boot - 2.4.4, versión mongodb - 4.4.4
En mi proyecto, quiero ingresar en 2 documentos diferentes de mongodb, pero si uno falla, debería retroceder. mongodb admite transacciones posteriores a la versión 4.0, pero solo si tiene al menos un conjunto de réplicas.
En mi caso, no tengo un conjunto de réplicas y tampoco puedo crearlo de acuerdo con la estructura de mi proyecto. No puedo usar el soporte de transacciones de mongodb porque no hay un conjunto de réplicas. Entonces, estoy usando Spring Transaction.
De acuerdo con los documentos de Spring, para usar la transacción en Spring Boot, solo necesita usar la anotación @transactional y todo funcionará (es decir, revertir o confirmar). Intenté muchas cosas de muchas fuentes, pero no se está revirtiendo la transacción si una falla.
El código de demostración está aquí. Este es un código de demostración, no un proyecto real. Esta es mi clase de servicio.
@Service public class UserService { @Autowired UserRepository userRepository; @Autowired UserDetailRepository userDetailRepository; @Transactional(rollbackFor = Exception.class) public ResponseEntity<JsonNode> createUser(SaveUserDetailRequest saveUserDetailRequest) { try { User _user = userRepository.save(new User(saveUserDetailRequest.getId(), saveUserDetailRequest.getFirstName(), saveUserDetailRequest.getLastName())); UserDetail _user_detail = userDetailRepository.save(new UserDetail(saveUserDetailRequest.getPhone(), saveUserDetailRequest.getAddress())); } catch (Exception m) { System.out.print("Mongo Exception"); } return new ResponseEntity<>(HttpStatus.OK); } }También probé el siguiente código pero aún no funciona,
@EnableTransactionManagement @Configuration @EnableMongoRepositories({ "com.test.transaction.repository" }) @ComponentScan({"com.test.transaction.service"}) public class Config extends AbstractMongoClientConfiguration{ private com.mongodb.MongoClient mongoClient; @Bean MongoTransactionManager transactionManager(MongoDbFactory dbFactory) { return new MongoTransactionManager(dbFactory); } @Bean public com.mongodb.MongoClient mongodbClient() { mongoClient = new com.mongodb.MongoClient("mongodb://localhost:27017"); return mongoClient; } @Override protected String getDatabaseName() { return "test"; } }El soporte de transacciones en Spring solo está ahí para facilitar las cosas, no reemplaza el soporte de transacciones para el almacén de datos subyacente que se está utilizando.
En este caso, simplemente delegará el inicio/compromiso de una transacción a MongoDB. Cuando use una base de datos, eventualmente delegará a la base de datos, etc.
Como este es el caso, los requisitos previos para MongoDB aún deben cumplirse y aún necesitará una réplica.