一、事务
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的隔离级别,也是最慢的事务隔离级别,因为它通常是通过完全锁定事务相关的数据库表来实现的 | 否 | 否 | 否 |