spring声明式事务通过@transactional注解实现,回滚指定异常需配置rollbackfor属性;默认仅对runtimeexception和error回滚,检查型异常需显式指定;注意自调用失效、传播行为、只读提示及避免吞异常。

Spring 声明式事务通过 @Transactional 注解实现,回滚指定异常只需配置 rollbackFor 属性即可,无需手动捕获或抛出异常。
启用事务管理
确保 Spring 项目已开启事务支持:
- Spring Boot 项目默认自动配置
DataSourceTransactionManager,无需额外配置 - 传统 XML 配置需添加
<annotation-driven></annotation-driven>并定义事务管理器 Bean - Java 配置方式需添加
@EnableTransactionManagement注解
@Transactional 基本用法
将注解加在 public 方法上(类级别也支持,但粒度较粗):
@Service
public class UserService {
@Transactional
public void createUser(User user) {
userDao.insert(user);
// 若后续操作失败,insert 会自动回滚
}
}
注意:同一类内方法自调用(如 A 方法调用本类 B 方法)不会触发事务代理,事务失效。
回滚指定异常类型
默认只对 RuntimeException 及其子类、Error 回滚;检查型异常(如 Exception)不会触发回滚。要让特定检查型异常也回滚,使用 rollbackFor:
-
@Transactional(rollbackFor = IOException.class)—— 对IOException及其子类回滚 -
@Transactional(rollbackFor = {SQLException.class, CustomException.class})—— 多个异常类型 -
@Transactional(rollbackFor = Exception.class)—— 对所有异常回滚(慎用,可能掩盖逻辑错误)
若希望某异常不回滚,可用 noRollbackFor,例如:@Transactional(noRollbackFor = BusinessException.class)。
事务传播行为与注意事项
默认传播行为是 REQUIRED(有则加入,无则新建),常见需求如下:
- 内部服务调用需独立事务(如记录日志),用
@Transactional(propagation = Propagation.REQUIRES_NEW) - 只读操作可加
readOnly = true提示数据库优化(如 MySQL 的SELECT不加锁) - 超时控制:
timeout = 30(单位秒),超时自动回滚 - 事务隔离级别:
isolation = Isolation.READ_COMMITTED(按需调整)
事务方法内避免 try-catch 吞掉异常——除非重新抛出或显式调用 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()。











