@Transactional注解详解
@Transactional是Spring声明式事务的核心注解,提供完整的事务控制能力。
基本用法
Java
@Service
public class UserService {
@Transactional
public void saveUser(User user) {
userRepository.save(user);
}
}
注解属性全览
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value / transactionManager | String | "" | 指定事务管理器 |
| propagation | Propagation | REQUIRED | 事务传播行为 |
| isolation | Isolation | DEFAULT | 事务隔离级别 |
| timeout | int | -1 | 超时时间(秒) |
| readOnly | boolean | false | 是否只读事务 |
| rollbackFor | Class[] | {} | 触发回滚的异常类型 |
| rollbackForClassName | String[] | {} | 触发回滚的异常类名 |
| noRollbackFor | Class[] | {} | 不触发回滚的异常类型 |
| noRollbackForClassName | String[] | {} | 不触发回滚的异常类名 |
传播行为配置
Java
// 默认:有事务则加入,无则新建
@Transactional(propagation = Propagation.REQUIRED)
// 必须在事务中调用,否则抛异常
@Transactional(propagation = Propagation.MANDATORY)
// 有事务则加入,无则非事务执行
@Transactional(propagation = Propagation.SUPPORTS)
// 总是新建事务,有则挂起当前事务
@Transactional(propagation = Propagation.REQUIRES_NEW)
// 非事务执行,有事务则挂起
@Transactional(propagation = Propagation.NOT_SUPPORTED)
// 必须非事务执行,有事务则抛异常
@Transactional(propagation = Propagation.NEVER)
// 嵌套事务,独立回滚
@Transactional(propagation = Propagation.NESTED)
隔离级别配置
Java
// 使用数据库默认隔离级别
@Transactional(isolation = Isolation.DEFAULT)
// 读未提交
@Transactional(isolation = Isolation.READ_UNCOMMITTED)
// 读已提交
@Transactional(isolation = Isolation.READ_COMMITTED)
// 可重复读
@Transactional(isolation = Isolation.REPEATABLE_READ)
// 串行化
@Transactional(isolation = Isolation.SERIALIZABLE)
回滚规则配置
Java
// 回滚所有Exception(默认只回滚RuntimeException和Error)
@Transactional(rollbackFor = Exception.class)
// 回滚多个异常
@Transactional(rollbackFor = {SQLException.class, IOException.class})
// 不回滚特定异常
@Transactional(noRollbackFor = BusinessException.class)
// 使用类名字符串
@Transactional(rollbackForClassName = "java.lang.Exception")
超时与只读配置
Java
// 设置超时时间30秒
@Transactional(timeout = 30)
// 只读事务(优化查询性能)
@Transactional(readOnly = true)
// 组合使用
@Transactional(readOnly = true, timeout = 60)
public User findById(Long id) {
return userRepository.findById(id).orElse(null);
}
多事务管理器
Java
// 配置多个事务管理器
@Configuration
public class DataSourceConfig {
@Bean
public PlatformTransactionManager primaryTxManager(
@Qualifier("primaryDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean
public PlatformTransactionManager secondaryTxManager(
@Qualifier("secondaryDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
// 指定事务管理器
@Service
public class OrderService {
@Transactional("primaryTxManager")
public void savePrimary(Order order) { }
@Transactional(transactionManager = "secondaryTxManager")
public void saveSecondary(Order order) { }
}
注解位置规则
Java
// 接口上(不推荐,代理机制可能导致不生效)
public interface UserService {
@Transactional
void save(User user);
}
// 类上(对public方法生效)
@Transactional
@Service
public class UserServiceImpl implements UserService {
public void save(User user) { }
}
// 方法上(优先级最高)
@Service
public class UserServiceImpl implements UserService {
@Transactional(timeout = 30)
public void save(User user) { }
@Transactional(readOnly = true)
public User findById(Long id) { return null; }
}
方法级注解优先级高于类级注解。
使用注意事项
Java
@Service
public class OrderService {
// 错误:private方法事务不生效
@Transactional
private void process() { }
// 错误:自调用不走代理,事务不生效
public void order() {
this.saveOrder(); // 直接调用,事务失效
}
@Transactional
public void saveOrder() { }
// 正确:注入自身或使用AopContext
@Autowired
private OrderService self;
public void order() {
self.saveOrder(); // 通过代理调用
}
}
要点总结
- propagation控制事务边界,isolation控制并发隔离
- 默认只回滚RuntimeException和Error
- rollbackFor = Exception.class实现全异常回滚
- 方法级注解优先级高于类级
- private方法和自调用导致事务失效
- 多数据源需指定transactionManager
📝 发现内容有误?点击此处直接编辑