SpringBoot @Transactional не грипп sh сеанс после исключения - PullRequest
0 голосов
/ 28 января 2020

Я хочу сохранить сущность. Поэтому я сохраняю (entity) и, когда возникает исключение, я пытаюсь сохранить (entity) после delete ().

Однако, поскольку был отображен оператор don't flush the session after an exception и запрос на исключение не был выполнен, распространение было установлено, как показано ниже.

@Service
@RequiredArgsConstructor
@Transactional
public class UserService {

    private final UserRepository userRepository;

    @Transactional(TxType.SUPPORTS)
    public String saveIfPossibleElseDeleteAndSave(final String name){

        final User user = User.builder()
                .age(0)
                .name(name)
                .gender(User.Gender.MAN)
                .build();

        try{
            userRepository.save(user);
            return "SAVE";
        } catch(RuntimeException e){
            userRepository.deleteOneLimit1();
            userRepository.save(user);
            return "DELETE AND SAVE";
        }
    }
}

Выше сделано. Вопрос в том, есть ли что-нибудь, что могло бы быть проблемой, когда метод выполняется много раз в секунду?

Кроме того, есть ли другой способ, кроме приведенного выше кода?

edit

Если выполняется save () и возникает ошибка, синтаксис печатается. java.sql.SQLException: The table 'users' is full

Таблица пользователей является таблицей памяти, поэтому, если она заполнена, удалите ее и сохраните снова.

1 Ответ

0 голосов
/ 28 января 2020

Вы должны использовать поле rollbackFor, чтобы определить, как вы должны действовать, если подкласс или подклассы Throwable будут выброшены, когда транзакция будет откатываться на RuntimeException, поэтому определите его следующим образом:

@Transactional(rollbackFor = Throwable.class)
...