From b357517585851ecb28b42d8745fcc1457f570ea8 Mon Sep 17 00:00:00 2001 From: wu xiangkai Date: Mon, 1 Aug 2022 23:38:15 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E5=85=B3=E4=BA=8ESp?= =?UTF-8?q?ring=20Transaction=E9=83=A8=E5=88=86=E7=9A=84=E7=AC=94=E8=AE=B0?= =?UTF-8?q?=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- spring/Spring core/Spring Data Access.md | 40 ++++++++++++++++++++++++ spring/spring boot/Spring Data.md | 9 ++++++ 2 files changed, 49 insertions(+) create mode 100644 spring/Spring core/Spring Data Access.md create mode 100644 spring/spring boot/Spring Data.md diff --git a/spring/Spring core/Spring Data Access.md b/spring/Spring core/Spring Data Access.md new file mode 100644 index 0000000..47c289a --- /dev/null +++ b/spring/Spring core/Spring Data Access.md @@ -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)进行回滚,对于Error,Spring事务也会执行回滚操作 + - 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注解时,方法级别的设置会优先被使用 diff --git a/spring/spring boot/Spring Data.md b/spring/spring boot/Spring Data.md new file mode 100644 index 0000000..6ddfe33 --- /dev/null +++ b/spring/spring boot/Spring Data.md @@ -0,0 +1,9 @@ +# Spring Data +- ## Spring Boot中选择连接池的算法: + - HikariCP的表现和并发性都很好,如果HikariCP可以被获取,选择HikariCP + - 如果HikariCP不能获取,选用Tomcat Datasource + - 如果Tomcat Datasource也不能获取,选用DBCP2 + - 如果上述都无法获取,选用Oracle UCP +- Spring Boot使用自定义连接池: + - 可以通过显式指定自定义的连接池种类来绕过该算法,通过指定spring.datasource.type来自定义连接池 + - 可以通过DatasourceBuilder来定义额外的datasource。如果定义了自己的datasouce bean,那么自动装配将不会发生。 \ No newline at end of file