SpringBoot @Transactional在出现异常后不刷新会话

时间:2020-01-28 14:02:40

标签: hibernate spring-boot jpa spring-data-jpa

我要保存实体。因此,我确实要保存(实体),并且在发生异常时,我尝试在删除()之后保存(实体)。

但是,由于显示了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";
        }
    }
}

以上已完成。问题是,每秒执行多次该方法是否会出现问题?

此外,除了上面的代码还有其他方法吗?

编辑

如果执行save()并发生错误,则会打印语法。 java.sql.SQLException: The table 'users' is full

用户表是一个内存表,因此如果它已满,请删除它并再次保存。

1 个答案:

答案 0 :(得分:0)

您应该使用rollbackFor字段来定义在事务将在Throwable上回滚时抛出RuntimeException的一个或多个子类时应采取的措施,因此请对其进行定义通过以下方式:

@Transactional(rollbackFor = Throwable.class)
相关问题