一、介绍
通过使用@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 及其子类异常时,都会触发事务的回滚操作。
标签:事务管理,回滚,Transactional,rollbackFor,事务,注解,保证数据,class From: https://www.cnblogs.com/wlwtop/p/17784775.html