首页 > 解决方案 > SpringBoot @Transactional 在异常后不刷新会话

问题描述

我想保存实体。所以我确实保存(实体),当发生异常时,我尝试在删除()之后保存(实体)。

但是,由于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

用户表是内存表,如果满了就删除再保存。

标签: hibernatespring-bootjpaspring-data-jpa

解决方案


您应该使用字段来定义如果在事务回滚时将抛出一个rollbackFor或多个子类,您应该如何操作,因此通过以下方式定义它:ThrowableRuntimeException

@Transactional(rollbackFor = Throwable.class)

推荐阅读