一、事务
1、简单简介: 事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功。
2、基本要素:原子性、一致性、隔离性、持久性

二、@Transactional
1、@Transactional注解可以作用于接口、接口方法、类以及类方法上
不建议在类上使用,因为作用于类上时,该类的所有public方法将都具有该类型的事务属性,不仅影响性能,而且每个方法可能需要不同的属性
不建议在接口或者接口方法上使用,因为这只有在使用基于接口的代理时它才会生效
所以尽量直接加在方法上

2、@Transactional注解应该只被应用到public方法上
这是由Spring AOP的本质决定的。如果你在protected、private或者默认可见性的方法上使用@Transactional注解将被忽略,但不会抛出任何异常。

3、源码学习

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Transactional {

	/**
     * 当在配置文件中有多个 TransactionManager , 可以用该属性指定选择哪个事务管理器。
     */
	@AliasFor("transactionManager")
	String value() default "";

	/**
     * 当在配置文件中有多个 TransactionManager , 可以用该属性指定选择哪个事务管理器。
     */
	@AliasFor("value")
	String transactionManager() default "";

	/**
     * 事务的传播行为,默认值为 REQUIRED。
     */
	Propagation propagation() default Propagation.REQUIRED;

	/**
     * 事务的隔离规则,默认值采用 DEFAULT。
     */
	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 {};

}

4、propagation属性

属性

传播行为

含义

REQUIRED

TransactionDefinition.PROPAGATION_REQUIRED

如果当前没有事务,就新建一个事务,如果已经存在一个事务,则加入到这个事务中。这是最常见的选择。

SUPPORTS

TransactionDefinition.PROPAGATION_SUPPORTS

支持当前事务,如果当前没有事务,就以非事务方式执行。

MANDATORY

TransactionDefinition.PROPAGATION_MANDATORY

表示该方法必须在事务中运行,如果当前事务不存在,则会抛出一个异常。

REQUIRES_NEW

TransactionDefinition.PROPAGATION_REQUIRES_NEW

表示当前方法必须运行在它自己的事务中。一个新的事务将被启动。如果存在当前事务,在该方法执行期间,当前事务会被挂起。

NOT_SUPPORTED

TransactionDefinition.PROPAGATION_NOT_SUPPORTED

表示该方法不应该运行在事务中。如果当前存在事务,就把当前事务挂起。

NEVER

TransactionDefinition.PROPAGATION_NEVER

表示当前方法不应该运行在事务上下文中。如果当前正有一个事务在运行,则会抛出异常。

NESTED

TransactionDefinition.PROPAGATION_NESTED

如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

5、isolation属性

属性

隔离规则

含义

脏读

不可重复读

幻读

DEFAULT

TransactionDefinition.ISOLATION_DEFAULT

使用后端数据库默认的隔离级别

READ_UNCOMMITTED

TransactionDefinition.ISOLATION_READ_UNCOMMITTED

允许读取尚未提交的数据变更(最低的隔离级别)




READ_COMMITTED

TransactionDefinition.ISOLATION_READ_COMMITTED

允许读取并发事务已经提交的数据




REPEATABLE_READ

TransactionDefinition.ISOLATION_REPEATABLE_READ

对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改




SERIALIZABLE

TransactionDefinition.ISOLATION_SERIALIZABLE

最高的隔离级别,完全服从ACID的隔离级别,也是最慢的事务隔离级别,因为它通常是通过完全锁定事务相关的数据库表来实现的