@Transactional事务源码
时间: 2023-10-12 10:22:11 浏览: 99
@Transactional 是 Spring Framework 中用于声明事务的注解,它可以被应用在类或方法上。当被应用在类上时,它表示该类所有 public 方法都是事务性的;当被应用在方法上时,它表示该方法是一个事务性方法。一般来说,@Transactional 注解应该被应用在 Service 层的方法上,因为这是业务处理的逻辑层,需要保证数据的一致性和完整性。
下面是 @Transactional 注解的源码:
```java
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Transactional {
@AliasFor("transactionManager")
String value() default "";
@AliasFor("value")
String transactionManager() default "";
Propagation propagation() default Propagation.REQUIRED;
Isolation isolation() default Isolation.DEFAULT;
int timeout() default -1;
boolean readOnly() default false;
Class<? extends Throwable>[] rollbackFor() default {};
String[] rollbackForClassName() default {};
Class<? extends Throwable>[] noRollbackFor() default {};
String[] noRollbackForClassName() default {};
}
```
其中的主要属性有:
- `value/transactionManager`:事务管理器的 bean 名称,如果只有一个事务管理器,可以省略。
- `propagation`:事务的传播行为,默认值为 `Propagation.REQUIRED`。
- `isolation`:事务的隔离级别,默认值为 `Isolation.DEFAULT`。
- `timeout`:事务超时时间,默认值为 -1,表示无限制。
- `readOnly`:事务是否只读,默认值为 false。
- `rollbackFor`/`noRollbackFor`:事务回滚的异常类(或其子类)。
@Transactional 注解是通过 AOP 实现的,具体来说,是通过 Spring AOP 或 AspectJ AOP 在运行时对带有该注解的类或方法进行代理,在代理对象的方法调用前后开启和提交事务。这里涉及到的 AOP 相关的代码可以参考 Spring Framework 的源码。
阅读全文