Spring事务
Spring事务
Transactional注解解析
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Transactional {
//transactionManager的别名
@AliasFor("transactionManager")
String value() default "";
//指定事务管理器
@AliasFor("value")
String transactionManager() default "";
//事务标签
String[] label() default {};
//事务传播机制
Propagation propagation() default Propagation.REQUIRED;
//事务隔离级别
Isolation isolation() default Isolation.DEFAULT;
//超时时间 秒
int timeout() default TransactionDefinition.TIMEOUT_DEFAULT;
//超时时间 秒
String timeoutString() default "";
//只读事务
boolean readOnly() default false;
//回滚策略 指定某个/些异常回滚
Class<? extends Throwable>[] rollbackFor() default {};
//回滚策略 指定某个/些异常回滚 全限定类名称
String[] rollbackForClassName() default {};
//不回滚策略 指定某个/些异常不回滚
Class<? extends Throwable>[] noRollbackFor() default {};
//不回滚策略 指定某个/些异常不回滚 全限定类名称
String[] noRollbackForClassName() default {};
}
spring事务传播
spring事务传播行为一共有7种:(前言: 当前事务指的是调用者自带的事务,A调用B,那么A就是当前事务)
- REQUIRED (默认传播行为),支持当前事务,如果当前没有事务,就新建一个事务,这个当前事务指的是上一个方法的事务,是别人传递过去的,类似于重入锁,A方法和B方法都有事务,A方法调用B方法,A的事务会传递给B,使它们共用同一个事务
- SUPPORTS 如果存在一个事务,支持当前事务,如果没有事务,则非事务执行,
- REQUIRES_NEW 开启一个新的事务。如果一个事务已经存在,则先将这个存在的事务挂起
- **MANDATORY 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常 **
- NOT_SUPPORTED 总是非事务地执行,并挂起任何存在的事务
- NEVER 总是非事务地执行,不加入任何事务;
- **NESTED 如果一个活动的事务存在,则运行在一个嵌套的事务中。 如果没有活动事务, 则按 REQUIRED 属性执行。 **
REQUIRED | 如果有事务在运行,当前的方法就在这个事务内运行,否则,就启动一个新的事务,并在自己的事务内运行 |
---|---|
SUPPORTS | 如果有事务在运行,当前的方法就在这个事务内运行.否则它可以不运行在事务中 |
REQUIRES_NEW | 当前的方法必须启动新事务,并在它自己的事务内运行.如果有事务正在运行,应该将它挂起 |
MANDATORY | 当前的方法必须运行在事务内部,如果没有正在运行的事务,就抛出异常 |
NOT_SUPPORTED | 当前的方法不应该运行在事务中。如果有运行的事务,将它挂起 |
NEVER | 当前的方法不应该运行在事务中。如果有运行的事务,就抛出异常 |
NESTED | 如果有事务在运行,当前的方法就应该在这个事务的嵌套事务内运行。否则,就启动一个新的事务,并在它自己的事务内运行. |
License:
CC BY 4.0