TLDR Как я могу решить эту проблему?
Не пытайтесь использовать транзакции для этого, придумайте какой-нибудь способ сделать систему в конечном итоге непротиворечивой.
Звучит так, будто вы хотите выполнить «queue.sendMessage» и «repository.save», как если бы они были транзакцией - либо обе были зафиксированы, либо ни одна не зафиксирована.Проблема в том, что «транзакция» на самом деле не транзакционная, даже в вашем примере с кроликом.
Рассмотрим основы работы транзакции:
- своего рода
begin
шаг, означающий, что следующие изменения являются частью транзакции - изменения сделаны (но не видны читателям)
- своего рода
commit
шаг для атомарной фиксации изменений (делая их видимыми длячитатели)
Однако в вашем случае очередь и хранилище являются отдельными объектами, поддерживаемыми отдельными сетевыми ресурсами, которые не общаются друг с другом.В этом случае нет атомарного коммита.Без атомарного коммита вы не сможете получить истинную транзакцию.Он «работает» в вашей демонстрации, потому что исключение отделено от кода, который выполняет запись.
Рассмотрим этот случай, чтобы более наглядно проиллюстрировать:
@Transactional
public User createUser(final User user){
messagingTemplate.convertAndSend("spring-boot", user.getEmail());
final User user = userRepository.save(user);
return user;
}
- Когда шаг фиксацииДля этого необходимо сделать видимым как сообщение (в очереди), так и пользователя (в репо)
- Для этого необходимо выполнить сетевой вызов как в очередь, так и в очередь.repo
- тот факт, что эти два вызова являются источником проблемы
- Если один из них удастся, а другой потерпит неудачу, вы окажетесь в несогласованном состоянии
- Вы можете сказать, что «транзакции могут быть откатаны» - но откат может привести к другому сетевому вызову, который, конечно, может завершиться неудачей.
Существуют способы сделатьВ целом распределенная система транзакционная, но это очень сложная проблема .Часто гораздо проще и быстрее учесть временную несогласованность и создать механизмы, позволяющие в конечном итоге привести систему в соответствие.