Как выполнить откат с 2 транзакциями тем же методом при загрузке Spring - PullRequest
0 голосов
/ 08 января 2020
@Service
@Transactional
public class UserServiceImpl implements UserService {

    @Autowired
    private UserRepository userRepository;

    @Autowired
    private RoleRepository roleRepository;

    @Transactional
    public void save(String name) {
        method1(name);
        method2(name);
    }

public void method1(String name){
userRepository.save(name)
}

    public void method2(String name) {
        roleRepository.save(name);// Error
    }
}
public interface UserService {
    void save(String name) throws Exception;
}

@PostMapping("/save")
    public void save() throws Exception {

        userService.save("SomeThing");
    }

У меня есть 2 метода в методе сохранения. Как видите, method2 имеет ошибку.

Я запускаю программу, первый метод печатает в базу данных. Однако, если второй метод неверен, я хочу, чтобы процесс отката упал, а первый метод не был записан в базу данных. Как я могу это сделать?

Я пытался использовать аннотацию @Transaction для method1 и method2, но ошибка продолжалась. И я попробовал Propagation.REQUIRES_NEW, и Propagation.REQUIRED, TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); никогда не менялся.

1 Ответ

2 голосов
/ 08 января 2020

Это совершенно логично, что вы пытаетесь сделать. Просто откат при сбое одной части вашего потока - это нормально.

Я дам дополнительную справку, чтобы убедиться, что у вас есть все:

  • @Transactional только откат, по умолчанию, когда RuntimeException выбрасывается. Вы можете настроить это. Проверьте do c, это очень легко узнать. Будьте осторожны, убедитесь, что вы используете org.springframework.transaction.annotation.Transactional. У вас есть больше вариантов с этим.
  • Понимание распространения является ключевым. По умолчанию распространение @Transactional равно Required, что означает, что он либо присоединится к существующей транзакции, либо создаст новую. Requires_New всегда создайте новый. В вашем случае, Propagation.REQUIRED это хороший.
  • Когда вы находитесь в транзакционном методе, добавление @Transactional к другому методу внутри вашего класса и выполнение внутреннего вызова не будут иметь никакого эффекта. Транзакция начинается, когда вы вводите в свой метод извне вашего класса. Когда вы в своем классе, другие аннотации не будут влиять на время выполнения.

Три вещи / вопросы для рассмотрения:

  • Что за ошибка выдает RoleRepository.save(...)?
  • Каков контекст? Это тест? Это работающее приложение? Не могли бы вы предоставить больше кода?
  • Как сказано в одном комментарии, прочитайте это: Spring Transaction Management с Hibernate и MySQL, Global и Local . С этим тоже могут быть проблемы ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...