откат при возникновении Исключение вручную - PullRequest
0 голосов
/ 12 июля 2020

в методе updateUser: если при вызове одной из макросервисов возникает исключение (например, updateUserContact, updateAccountContact), операция updateUser должна быть откатом.

Как выполнить операцию транзакции для создания, обновления и удалить вручную в Java?

В методе создания при возникновении исключения события удаляю связанные записи.

Но я не знаю, что делать в обновлении и удалять .

если вызов userContactStub.grpcUpdate имеет Exception, я должен откатить userAcount.

Есть ли у кого-нибудь предложения по откату транзакции в обновлении?

Я использую jpa, grp c (Для подключения микросервисов), springBoot. каждая микрослужба имеет источник данных.

//updateUser
AdminUser adminUser = findById();
adminUser.setFirstName(adminUserModel.getFirstName());
adminUser.setLastName(adminUserModel.getLastName());
adminUser.setPassword(PasswordEncoderGenerator.generate(adminUserModel.getPassword()));
adminUser.setUsername(adminUserModel.getUsername());
adminUser.setDateOfBirth(CalendarTools.getDateFromCustomDate(adminUserModel.getDateOfBirth()));
adminUser.setGender(etcItemService.findByIdAndCheckEntity(adminUserModel.getGender_id(), GenderEnum.class,null,true));

adminUser = adminUserRepository.save(adminUser);

//update userAcount For Admin
//call grpcUpdate
this.userAcountStub.grpcUpdate(createRequestModel);


//update UserContact For Admin
//call grpcUpdate
this.userContactStub.grpcUpdate(createRequestModel);


adminUserModel.setId(adminUser.getId());
return adminUserModel;

Ответы [ 3 ]

0 голосов
/ 12 июля 2020

если вы используете JPa (спящий режим?), Вы можете просто добавить аннотацию @Transactional для отката поверх методов create, update и т.д. c. İt справляется с этой работой и решает проблему.

0 голосов
/ 12 июля 2020
try(Connection conn = DriverManager.getConnection(dbURL,dbUser,dbPassword);){
conn.setAutoCommit(false);


// perform operations such as insert, update, delete here
// ..

// if everything is OK, commit the transaction
conn.commit();

} catch(SQLException e) {
// in case of exception, rollback the transaction
conn.rollback();
}
0 голосов
/ 12 июля 2020

Какой фреймворк вы используете? Вы используете JPA? Предположим, вы используете JPA, вам не о чем беспокоиться. Оболочка JPA в значительной степени гарантирует целостность ваших данных в случае возникновения исключения (обычно это откат вручную). Однако я не уверен, как откатить перевод базы данных, если одна из вызванных вами микрослужб вызвала исключение.

...