1. 事务管理的基本概念与挑战
在企业级应用开发中,数据一致性是核心诉求之一。想象一下银行转账场景:从A账户扣款和向B账户加款必须作为一个不可分割的整体操作,这就是典型的事务需求。Spring框架通过@Transactional注解为开发者提供声明式事务管理能力,让我们不必手动处理复杂的事务边界控制。
传统JDBC事务管理需要显式调用connection.setAutoCommit(false)、commit()和rollback(),这种编程式事务存在两大痛点:一是业务代码与事务管理代码高度耦合;二是容易遗漏异常处理导致连接泄漏。Spring的解决方案是将事务管理抽象为横切关注点,通过AOP实现非侵入式的事务控制。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. @Transactional注解的核心作用解析
2.1 注解的基本属性配置
java复制@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Transactional {
String value() default "";
Propagation propagation() default Propagation.REQUIRED;
Isolation isolation() default Isolation.DEFAULT;
int timeout() default TransactionDefinition.TIMEOUT_DEFAULT;
boolean readOnly() default false;
Class<? extends Throwable>[] rollbackFor() default {};
String[] rollbackForClassName() default {};
Class<? extends Throwable>[] noRollbackFor() default {};
String[] noRollbackForClassName() default {};
}
关键属性说明:
propagation:事务传播行为,默认REQUIRED(当前有事务则加入,没有则新建)isolation:事务隔离级别,默认使用数据库默认级别timeout:事务超时时间(秒),超过则自动回滚readOnly:优化标记,true时提示数据库启用只读优化rollbackFor:指定触发回滚的异常类型
2.2 事务传播行为详解
传播行为决定了事务方法之间的交互方式,常见七种模式:
| 传播行为类型 | 说明 | 适用场景 |
|---|---|---|
| REQUIRED | 默认值,支持当前事务,不存在则新建 | 大多数业务方法 |
| SUPPORTS | 支持当前事务,不存在则以非事务执行 | 查询方法可能适用 |
| MANDATORY | 必须在事务中调用,否则抛异常 | 严格要求事务上下文的场景 |
| REQUIRES_NEW | 新建事务,挂起当前事务(如果存在) | 独立业务操作(如日志记录) |
| NOT_SUPPORTED | 以非事务方式执行,挂起当前事务 | 不涉及数据修改的操作 |
