@Transactional 注解配置信息整理(完整10项),最后表格整理Propagation 传播行为对比表和Isolation 隔离级别对比表

@Transactional 注解配置信息整理(完整10项)


一、核心配置参数详解(10项)
参数名 作用 默认值 示例值 代码示例
value 事务管理器别名(与transactionManager同义) 默认事务管理器 "myTxManager" @Transactional(value = "orderTxManager")
transactionManager 指定事务管理器名称(多数据源时必填) 默认事务管理器 "dataSource1TxManager" @Transactional(transactionManager = "slaveTxManager")
propagation 定义事务传播行为 Propagation.REQUIRED Propagation.REQUIRES_NEW @Transactional(propagation = Propagation.MANDATORY)
isolation 定义事务隔离级别 Isolation.DEFAULT Isolation.READ_COMMITTED @Transactional(isolation = Isolation.SERIALIZABLE)
readOnly 标记事务为只读(优化性能) false true @Transactional(readOnly = true)
timeout 事务超时时间(秒) -1(永不超时) 30 @Transactional(timeout = 60)
rollbackFor 指定抛出指定异常时回滚 {SQLException.class} @Transactional(rollbackFor = {IOException.class})
rollbackForClassName 通过字符串类名指定回滚异常(兼容性用途) {"java.lang.ArithmeticException"} @Transactional(rollbackForClassName = {"java.io.IOException"})
noRollbackFor 指定抛出指定异常时不回滚 {RuntimeException.class} @Transactional(noRollbackFor = {BusinessException.class})
noRollbackForClassName 通过字符串类名指定不回滚异常(兼容性用途) {"com.example.MyException"} @Transactional(noRollbackForClassName = {"org.example.NoRollbackException"})

二、完整代码案例
@Service
public class OrderService {

    // 完全配置示例:独立事务、高隔离、回滚策略、超时
    @Transactional(
        propagation = Propagation.REQUIRES_NEW,       // 新事务,挂起当前事务
        isolation = Isolation.READ_COMMITTED,         // 防止脏读
        readOnly = false,                             // 可读写
        timeout = 30,                                 // 30秒超时
        rollbackFor = {SQLException.class},            // SQL异常时回滚
        noRollbackForClassName = {"com.example.SuccessException"} // 特定成功异常不回滚
    )
    public void processOrder() {
        try {
            // 业务逻辑(如扣库存、记录日志)
            if (/* 某条件 */) {
                throw new SuccessException("操作成功但无需回滚");
            }
        } catch (IOException e) {
            throw new RuntimeException("强制回滚", e);
        }
    }
}

三、Propagation 传播行为对比表
枚举值 行为描述 典型场景 代码示例
REQUIRED 默认,若存在事务则加入,否则新建事务 普通业务逻辑(如保存订单) @Transactional // 默认
REQUIRES_NEW 总新建事务,挂起当前事务(若存在) 关键操作需独立事务(如扣款后记录日志) @Transactional(propagation = Propagation.REQUIRES_NEW)
SUPPORTS 若存在事务则加入,否则不使用事务 只读查询且允许无事务(如异步查询) @Transactional(propagation = Propagation.SUPPORTS)
NOT_SUPPORTED 挂起当前事务,以非事务方式执行 非关键操作(如记录日志、发送邮件) @Transactional(propagation = Propagation.NOT_SUPPORTED)
MANDATORY 必须存在事务,否则抛出异常 强制要求事务的方法调用(如内部服务层) @Transactional(propagation = Propagation.MANDATORY)
NEVER 必须无事务,否则抛出异常 明确禁止事务的场景(如纯查询接口) @Transactional(propagation = Propagation.NEVER)
NESTED 嵌套事务(子事务可回滚,父事务继续) 部分回滚需求(如批量处理单条失败时仅回滚子事务) @Transactional(propagation = Propagation.NESTED)

四、Isolation 隔离级别对比表
枚举值 允许现象 典型场景 代码示例
DEFAULT 由底层数据库决定(通常为READ_COMMITTED 通用场景(依赖数据库默认行为) @Transactional // 默认
READ_UNCOMMITTED 允许脏读、不可重复读、幻读 性能优先但数据一致性要求低(如实时统计) @Transactional(isolation = Isolation.READ_UNCOMMITTED)
READ_COMMITTED 防止脏读,但允许不可重复读和幻读 高并发读操作(如订单查询、报表统计) @Transactional(isolation = Isolation.READ_COMMITTED)
REPEATABLE_READ 防止脏读和不可重复读,但允许幻读 严格一致性场景(如库存扣减、账户余额更新) @Transactional(isolation = Isolation.REPEATABLE_READ)
SERIALIZABLE 最高隔离,完全串行化,防止所有并发问题 极少数关键操作(如银行转账、秒杀活动) @Transactional(isolation = Isolation.SERIALIZABLE)

五、关键注意事项
  1. 作用范围限制

    • @Transactional 仅对 public 方法生效,且需通过 AOP 代理调用。
    • 同一类内直接调用方法可能导致事务失效,需通过接口或 @EnableAspectJAutoProxy(proxyTargetClass = true) 解决。
  2. 回滚规则

    • 默认仅对 RuntimeExceptionError 自动回滚,需显式配置 rollbackFor 处理检查异常(如 Exception)。
    • noRollbackFor 可指定某些异常不触发回滚(如业务成功但需记录的异常)。
  3. 性能权衡

    • 高隔离级别(如 SERIALIZABLE)可能导致锁竞争,需根据场景选择。
    • 长事务需设置合理 timeout,避免数据库连接超时。

通过以上配置,可灵活控制事务的传播、隔离、回滚等行为,满足复杂业务场景需求。

你可能感兴趣的:(python,数据库,开发语言)