添加了关于Spring Transaction部分的笔记内容

This commit is contained in:
wu xiangkai
2022-08-01 23:38:15 +08:00
parent e948e43f44
commit b357517585
2 changed files with 49 additions and 0 deletions

View File

@@ -0,0 +1,40 @@
# Spring Data Access
- ## Spring事务
- 本地事务和全局事务:
- 全局事务:全局事务允许使用多个事务资源,应用服务器来对全局事务进行管理
- 本地事务:本地事务无法管理多个事务资源
- 本地事务和全局事务的优缺点
- 全局事务的使用需要和服务器环境相绑定,降低了代码的重用性
- 本地事务无法使用多个事务资源无法通过JTA等框架来对多个事务资源进行管理无法使用分布式事务
- ## 声明式事务
- Spring中声明式事务是通过AOP来实现的
- 在声明式事务中,可以为方法级的粒度指定事务行为
- 声明式事务的回滚规则:
- 在Spring声明式事务中可以为事务指定回滚规则即指定针对哪些异常事务会自动执行回滚操作
- 在默认情况下只有抛出unchecked异常通常为RuntimeException声明式事务才会进行回滚
- 声明式事务的实现细节:
- 声明式事务通过aop代理实现并且事务的advice是通过xml元数据配置来驱动的
- aop和事务元数据联合产生了一个aop代理对象并且该代理对象通过使用TransactionInterceptor和TransactionManager来实现事务
- @Transactional通常和线程绑定的事务一起工作线程绑定的事务由PlatformTransactionManager管理。@Transactional会将事务暴露给当前执行线程中所有的dao操作
- 声明式事务的回滚:
- 在Spring事务中推荐让事务回滚的方式是在事务执行的方法中抛出一个异常
- Spring事务在默认情况下只会针对unchecked异常RuntimeException进行回滚对于ErrorSpring事务也会执行回滚操作
- checked异常并不会导致事务的回滚操作可以注册rollback rule来指定对特定的异常包括checked异常进行回滚操作
- rollback rule
- 回滚规则rollback rule通常用来指定当一个异常被抛出时是否为该异常执行事务的回滚操作
-@Transactional注解中可以指定rollbackFor/noRollbackFor、rollbackForClassName/noRollbackForClassName来指定为那些异常类执行回滚操作
```java
@Transactional(rollbackFor={MyException.class})
public void myOperation() {
// ...
}
```
- ## 基于注解的声明式事务
- @Transactional既可以作用于类上,也可以作用于方法上。当作用于类上时,该声明类中所有的方法都会被声明是事务的,该类子类中所有的方法也都是事务的
- @Transactional是可以继承的,被@Inherited元注解修饰
>@Inherited类是元注解,用来修饰注解类。如果一个注解类被@Inherited注解标识那么在对class查询该注解类时如果当前class没有声明该注解将会在当前class的父类中查找该注解依次递归。直到在父类中找到该注解或是到达继承结构的顶部Object类@Inherited标注的注解仅能在类继承中有效,如注解被标注在接口上,那么将@Inherited标注的注解将不会被递归查询到
- 并且class级别的@Transactional并不应用在从父类继承的方法上,即若一个类被@Transactional注解标注,并且该类从父类继承方法,那么该类从父类继承的方法并不会被看作是事务的,除非在该类中重新声明继承的方法。
- 通过在Configuration类上注解@EnableTransactionManagement,配合@Transactional可以将一个bean对象声明是事务的
- 当基于标准spring配置时应该仅将@Transactional注解标注于public方法,当将@Transactional注解标注于非public方法时无效
- 在Spring中仅推荐将@Transactional注解应用于类上不推荐将其应用在接口接口方法上。如果将其应用在接口上那么该事务配置仅仅对基于接口的动态代理有效对基于class的代理无效。
- 当类级别和方法级别都设置了@Transactional注解时,方法级别的设置会优先被使用