全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-18 8 分钟 ✍️ juanwangdev

@Transactional注解详解

@Transactional是Spring声明式事务的核心注解,提供完整的事务控制能力。

基本用法

Java
@Service
public class UserService {

    @Transactional
    public void saveUser(User user) {
        userRepository.save(user);
    }
}

注解属性全览

属性类型默认值说明
value / transactionManagerString""指定事务管理器
propagationPropagationREQUIRED事务传播行为
isolationIsolationDEFAULT事务隔离级别
timeoutint-1超时时间(秒)
readOnlybooleanfalse是否只读事务
rollbackForClass[]{}触发回滚的异常类型
rollbackForClassNameString[]{}触发回滚的异常类名
noRollbackForClass[]{}不触发回滚的异常类型
noRollbackForClassNameString[]{}不触发回滚的异常类名

传播行为配置

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

📝 发现内容有误?点击此处直接编辑

← 上一篇 多个切面执行顺序
下一篇 → Spring事务与数据库锁
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库