1、使用事务方式1--->基于xml配置aop切面来提供事务功能:
1.1、配置数据源:
<bean id="pooledDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
<property name="driverClass" value="${jdbc.driverClass}"></property>
</bean>
1.2、配置事务管理器
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="pooledDataSource"></property>
</bean>
1.3、配置事务切面的增强
<tx:advice id="myAdvice" transaction-manager="transactionManager">
<!--事务属性 -->
<tx:attributes>
<!-- 指明哪些方法是事务方法;切入点表达式只是说,事务管理器要切入这些方法,
哪些方法加事务使用tx:method指定的 -->
<tx:method name="*"/>
<tx:method name="checkout" propagation="REQUIRED" timeout="-1"/>
<tx:method name="get*" read-only="true"/>
</tx:attributes>
</tx:advice>
1.4、配置事务切面
增强有了,还缺少切点point,如下定义切点以及切面;
<aop:config>
<aop:pointcut expression="execution(* com.atguigu.service.**.*(..))" id="txPoint"/>
<!-- 事务建议;事务增强 advice-ref:指定曾强 -->
<aop:advisor advice-ref="myAdvice" pointcut-ref="txPoint"/>
</aop:config>
这样就完成了基于xml的事务功能声明了。
2、使用事务方式1--->基于注解来声明事务
2.1、配置数据源:
<bean id="pooledDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
<property name="driverClass" value="${jdbc.driverClass}"></property>
</bean>
2.2、配置事务管理器:
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="pooledDataSource"></property>
</bean>
2.3、开启事务注解驱动:
<tx:annotation-driven
transaction-manager="transactionManager"
order="2"
proxy-target-class="true"
mode="aspectj"
/>
<tx:annotation-driven 标签核心属性:
1、transaction-manager:指定事务管理器,默认就是"transactionManager"。
2、order:事务切面的顺序,数字越大执行越靠后。
3、proxy-target-class:是否代理类而不是代理接口,默认是fasle指可以代理接口。
4、mode:代理模式,有两种,一种是"proxy" ,另外一种是"aspectj"。
2.4、基于注解@Transactional使用事务功能
在需要使用事务的方法上标如下注解:@Transactional(readOnly = false, transactionManager = "transactionManager", timeout = 1000, rollbackFor = RuntimeException.class, noRollbackFor = XxxException.class)
3、springboot 又是如何自动配置事务功能的呢???
老规矩我们来到spring-boot-autoconfigure包下面的spring.factories文件中,我们来查找事务相关的自动配置类,找到的配置类列表如下:
org.springframework.boot.autoconfigure.data.r2dbc.R2dbcTransactionManagerAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration,\
org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration,\
我们主要关注的是TransactionAutoConfiguration这个配置类,它表示事务自动配置,我们查看其源码如下:
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(PlatformTransactionManager.class)
需要在事务管理器实例配置完成后才能激活当前事务的自动装配类,
也就是说会先配置一个事务管理器transactionManager实例,
然后才会去配置事务的切面。
@AutoConfigureAfter({ JtaAutoConfiguration.class, HibernateJpaAutoConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class, Neo4jDataAutoConfiguration.class })
@EnableConfigurationProperties(TransactionProperties.class)
public class TransactionAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public TransactionManagerCustomizers platformTransactionManagerCustomizers(
ObjectProvider<PlatformTransactionManagerCustomizer<?>> customizers) {
return new TransactionManagerCustomizers(customizers.orderedStream().collect(Collectors.toList()));
}
@Bean
@ConditionalOnMissingBean
@ConditionalOnSingleCandidate(ReactiveTransactionManager.class)
public TransactionalOperator transactionalOperator(ReactiveTransactionManager transactionManager) {
return TransactionalOperator.create(transactionManager);
}
@Configuration(proxyBeanMethods = false)
@ConditionalOnSingleCandidate(PlatformTransactionManager.class)
public static class TransactionTemplateConfiguration {
@Bean
@ConditionalOnMissingBean(TransactionOperations.class)
public TransactionTemplate transactionTemplate(PlatformTransactionManager transactionManager) {
return new TransactionTemplate(transactionManager);
}
}
@Configuration(proxyBeanMethods = false)
@ConditionalOnBean(TransactionManager.class)
@ConditionalOnMissingBean(AbstractTransactionManagementConfiguration.class)
启用事务管理配置类,在这类里面添加了两个配置类,分别是JdkDynamicAutoProxyConfiguration、
CglibAutoProxyConfiguration 且上面都标注了注解@EnableTransactionManagement,这个注解的作用就
跟注解驱动标签<tx:annotation-driven的功能一摸一样,因此其实spring boot自动配置事务的方式也就是
在变相的使用<tx:annotation-driven。
public static class EnableTransactionManagementConfiguration {
@Configuration(proxyBeanMethods = false)
@EnableTransactionManagement(proxyTargetClass = false)
@ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "false",
matchIfMissing = false)
public static class JdkDynamicAutoProxyConfiguration {
}
@Configuration(proxyBeanMethods = false)
@EnableTransactionManagement(proxyTargetClass = true)
@ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "true",
matchIfMissing = true)
public static class CglibAutoProxyConfiguration {
}
}
}
由上面我们知道了,想要使用spring提供的事务功能,必须具备如下组件:
第1个:事务管理器:负责对事务的管理,比如开启、提交、回滚事务等操作。
第2个:事务切面:定义事务的特性、以及定义需要提供事务的方法信息。
在事务的自动配置类 TransactionAutoConfiguration 上面标注的注解: @AutoConfigureAfter({ JtaAutoConfiguration.class, HibernateJpaAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, Neo4jDataAutoConfiguration.class })就是提供第1个组件的支持。
而激活TransactionAutoConfiguration后配置的JdkDynamicAutoProxyConfiguration或者CglibAutoProxyConfiguration配置类上的注解@EnableTransactionManagement所做的就是提供第2个组件的支持。
4、以上就是spring boot中自动配置事务的原理