Spring的@EnableTransactionManagement 和@Transactional原理
@Configuration
@EnableTransactionManagement
public class AppConfig {
// 配置类内容
}
@Service
public class MyService {
@Transactional
public void processPayment(Payment payment) {
// 这里是业务逻辑
}
}
@EnableTransactionManagement 会像spring容器中注入一个InfrastructureAdvisorAutoProxyCreator,这是一个BeanPostProcessor,我前文中有说到BeanPostProcessor是一个初始化后会执行的接口。所以bean实例化、依赖注入、初始化、然后会进行初始化后的步骤,即走BeanPostProcessor的实现,实现中是aop的内容。会去看这个bean是否是advisor切面,找是否有@Transactional,如果有,那就创建代理对象,这就是aop的实现。
spring事务执行流程:
大致就是:连接数据库、autocommit为false、执行sql、提交事务
具体是:代理对象在执行某个方法时,会再次判断当前执行的方法是否和
BeanFactoryTransactionAttributeSourceAdvisor匹配,如果匹配则执行该Advisor中的
TransactionInterceptor的invoke()方法,执行基本流程为:
1. 利用所配置的PlatformTransactionManager事务管理器新建一个数据库连接
2. 修改数据库连接的autocommit为false
3. 执行MethodInvocation.proceed()方法,简单理解就是执行业务方法,其中就会执行sql
4. 如果没有抛异常,则提交
5. 如果抛了异常,则回滚
Spring事务传播机制
required是默认的