@Transactional:声明式事务管理,保证数据一致性

发布时间 2023-10-24 14:53:41作者: Tk小武

一、介绍

通过使用@Transactional注解,我们可以更加方便地管理事务,保障数据的一致性和可靠性。

在实际项目中,合理使用@Transactional注解可以提高「开发效率 」和代码「可维护性 」

二、用法

@Transactional(rollbackFor = Exception.class)
public ResponseDTO<String> update(NoticeUpdateDTO updateDTO) {
NoticeEntity entity = noticeDao.selectById(updateDTO.getId());
if (entity == null) {
return ResponseDTO.wrap(ResponseCodeConst.ERROR_PARAM, "此系统通知不存在");
}
if (JudgeEnum.YES.getValue().equals(entity.getSendStatus())) {
return ResponseDTO.wrap(ResponseCodeConst.ERROR_PARAM, "此系统通知已发送无法修改");
}
noticeManage.update(entity, updateDTO);
return ResponseDTO.succ();
}

 三、总结

@Transactional 是 Spring 框架中用于管理事务的注解,它可以被应用到类或方法上。使用 @Transactional 注解可以使方法具有事务性质,即当该方法执行时,如果发生异常或错误,会自动回滚到之前的状态。

在 Spring 中,事务管理是通过 AOP(面向切面编程)实现的。当一个带有 @Transactional 注解的方法被调用时,Spring 会自动创建一个事务,并在方法执行结束后提交或回滚该事务,具体根据方法执行结果来决定。

@Transactional 注解有以下常用属性:

  • propagation:设置事务的传播行为,即当前方法执行时,是否需要创建新的事务。常用的取值有 REQUIRED、SUPPORTS、MANDATORY 等。
  • isolation:设置事务的隔离级别,即当前事务与其他事务之间的关系。常用的取值有 READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ、SERIALIZABLE 等。
  • timeout:设置事务的超时时间,即事务执行的最长时间。默认值为 -1,表示没有超时限制。
  • readOnly:设置事务是否为只读事务,即该事务是否允许修改数据库。默认值为 false,表示该事务可读可写。

下面是一个使用 @Transactional 注解的例子:

javaCopy Code
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    @Override
    @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED)
    public void updateUser(User user) {
        userDao.updateUser(user);
    }
}

在上面的例子中,updateUser 方法被标注为 @Transactional 注解,表示该方法需要执行事务。propagation 属性设置为 REQUIRED,表示如果当前存在事务,则加入该事务,否则新建一个事务。isolation 属性设置为 READ_COMMITTED,表示该事务采用读已提交的隔离级别。

总之,@Transactional 注解是 Spring 中非常重要的事务管理工具,可以帮助开发者更方便地管理事务。

四、常用写法

@Transactional(rollbackFor = Exception.class)

是 @Transactional 注解的一个属性设置。它指定了在哪些异常情况下需要回滚事务。

当一个方法被标注了 @Transactional 注解时,如果在方法执行过程中发生了被 rollbackFor 属性指定的异常或其子类异常,事务将被回滚,即之前的操作都会被撤销。

在上述代码中,rollbackFor 属性被设置为 Exception.class,表示任何 Exception 及其子类异常都会触发事务回滚。也就是说,无论在方法中抛出了哪种异常,都会导致事务回滚。

通常情况下,建议将 rollbackFor 属性设置为具体的异常类型,以便更精确地控制事务的回滚。例如,可以将其设置为某个自定义异常类,或者设置为多个异常类,如 rollbackFor = {SQLException.class, IOException.class}。

如果没有显式设置 rollbackFor 属性,事务默认会在遇到 RuntimeException 或 Error 时回滚,而对于 checked exception(非 RuntimeException 的异常),默认是不会回滚事务的。

总结起来,@Transactional(rollbackFor = Exception.class) 表示在方法执行过程中,遇到任何 Exception 及其子类异常时,都会触发事务的回滚操作。