# 《Spring核心技术》第33章:深度解析@Transactional注解

作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)
源码地址:https://github.com/binghe001/spring-annotation-book/tree/master/spring-annotation-chapter-29 (opens new window)

沉淀,成长,突破,帮助他人,成就自我。

大家好,我是冰河~~


  • 本章难度:★★★★☆

  • 本章重点:从源码级别彻底掌握Spring底层解析@Transactional注解属性的执行流程。


本章目录如下所示:

  • 学习指引
  • 注解说明
    • 注解源码
    • 使用场景
  • 源码时序图
  • 源码解析
  • 总结
  • 思考
  • VIP服务

# 一、学习指引

Spring中的@Transactional注解,你真的彻底了解过吗?

学习过Spring事务的小伙伴对@Transactional注解应该都不陌生,在需要使用Spring事务的方法上标注@Transactional注解,Spring在执行方法时,就能够自动开启事务、提交事务以及回滚事务。此时,完全不需要开发人员过多的关注事务的开启、提交与回滚操作。那经常使用@Transactional注解的你,是否想过Spring底层是如何解析@Transactional注解的呢?

# 二、注解说明

关于@Transactional注解的一点点说明~~

在基于Spring注解开发应用程序时,如果需要使用Spring事务,通常会在方法上标注@Transactional注解搞定,那关于@Transactional注解有哪些细节需要关注呢?

# 2.1 注解源码

@Transactional注解的源码详见:org.springframework.transaction.annotation.Transactional。

/**
 * @author Colin Sampaleanu
 * @author Juergen Hoeller
 * @author Sam Brannen
 * @author Mark Paluch
 * @since 1.2
 * @see org.springframework.transaction.interceptor.TransactionAttribute
 * @see org.springframework.transaction.interceptor.DefaultTransactionAttribute
 * @see org.springframework.transaction.interceptor.RuleBasedTransactionAttribute
 */
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Reflective
public @interface Transactional {
	@AliasFor("transactionManager")
	String value() default "";
	/**
	 * @since 4.2
	 */
	@AliasFor("value")
	String transactionManager() default "";
	/**
	 * @since 5.3
	 */
	String[] label() default {};
	Propagation propagation() default Propagation.REQUIRED;
	Isolation isolation() default Isolation.DEFAULT;
	int timeout() default TransactionDefinition.TIMEOUT_DEFAULT;

	/**
	 * @since 5.3
	 */
	String timeoutString() default "";
	boolean readOnly() default false;
	Class<? extends Throwable>[] rollbackFor() default {};
	String[] rollbackForClassName() default {};
	Class<? extends Throwable>[] noRollbackFor() default {};
	String[] noRollbackForClassName() default {};
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

从@Transactional注解的源码可以看出,@Transactional是从Spring1.2版本开始提供的注解,可以标注到接口上,类上,也可以标注到方法上。当标注到接口上时,当前接口的所有实现类中,实现了接口的方法都会支持Spring事务。当标注到类上时,当前类的所有方法都支持Spring事务。当标注到方法上时,当前方法支持Spring事务。

Spring事务的优先级为:标注到方法上的事务优先级 > 标注到类上的事务优先级 > 标注到接口上的事务优先级。

注意:Spring中的事务会有失效的场景,在后续的文章中会详细解析Spring事务失效的场景。

在实际项目开发过程中,通常会标注到方法上。在@Transactional注解中,提供了如下属性。

  • value:String类型的属性,用以指定事务管理器的唯一标识
  • transactionManager:Spring4.2版本开始新增的String类型的属性,作用同value属性。
  • label:Spring5.3版本新增的String数组类型的属性,设置属性的标签。
  • propagation:Propagation枚举类型的属性,指定事务的传播行为,具体可以参见第31章的相关内容。
  • isolation:Isolation枚举类型的属性,指定事务的隔离级别,具体可以参见第31章的相关内容。
  • timeout:指定事务的超时时间,单位为秒,当事务执行时间超过timeout秒时,就会触发超时回滚操作,并释放事务占用的资源。
  • timeoutString:Spring5.3版本开始提供的String类型的属性,以String类型设置超时时间,单位为秒。
  • readOnly:指定是否为只读事务,true:是只读事务,false:非只读事务。
  • rollbackFor:指定异常类的Class对象,当抛出指定类型的异常或者其子类型的异常时,事务会自动回滚。
  • rollbackForClassName:指定异常类的全类名,当抛出指定全类名的异常或者其子类型的异常时,事务会自动回滚。
  • noRollbackFor:指定异常类的Class对象,当抛出指定类型的异常或者其子类型的异常时,事务不会自动回滚。
  • noRollbackForClassName:指定异常类的全类名,当抛出指定全类名的异常或者其子类型的异常时,事务不会自动回滚。

# 查看完整文章

加入冰河技术 (opens new window)知识星球,解锁完整技术文章与完整代码