Spring 事务

Spring 事务

  • 使用Spring事务
  • Spring事务传播

使用Spring事务

引入依赖


      org.springframework
      spring-tx
      5.3.20
    

开启Spring事务注解
@EnableTransactionManagement
@Transactional

该注解实际是导入了两个bean:
1. AutoProxyRegistrar.class:通过beanDefinition向Spring容器注册一个类InfrastructureAdvisorAutoProxyCreator(继承AbstractAdvisorAutoProxyCreator),通过继承关系可知它一个beanPostProcessor,获取所有Advisor在bean初始化后判断是否符合Advisor的筛选(类上或方法上加了是否@Transactional注解),从而需要生成代理对象。
2. ProxyTransactionManagementConfiguration.class 往Spring容器添加3个bean:
BeanFactoryTransactionAttributeSourceAdvisor:上一步骤所需的Advisor,判断哪些bean需要做事务相关的切面逻辑。这个Advisor的Advice就是另一个生成的Bean即TransactionInterceptor。
TransactionAttributeSource:定义pointCut,匹配规则就是类上或方法上是否有@Transactional注解。
TransactionInterceptor:上述Advisor中的Advice。

Spring事务传播

事务传播机制
Prptagation.REQUIRED :默认。如果当前没有事务,开启一个事务;如果有,使用当前事务。
Propagation.REQUIRES_NEW:如果当前没有事务,开启新事务;如果当前有事务,挂起当前事务后,开启新事务
Propagation.SUPPORTS:如果当前存在事务,则加入该事务;如果没有事务,则以非事务方式执行。适用于查询操作。
Propagation.NOT_SUPPORT:以非事务方式执行操作,如果当前存在事务,则挂起该事务。
Propagation.MANDATORY:如果当前存在事务,则加入该事务;如果没有事务,则抛出异常。
Propagation.NESTED:如果有事务,在当前位置设置savepoint,回滚时可以归滚到安全点;如果没有事务,开启新事务。
Propagation.NEVER: 以非事务方式执行,如果当前存在事务,则抛出异常。

Spring事务的连接是保存在ThreadLocal中的一个Map结构,key是datasource,value是连接对象。
如果当前存在一个事务(连接),又要开启新事务(连接),则会把当前事务挂起(把当前连接从ThreadLocal中移除,放入要给恢复资源类中,也是ThreadLocal),再创建一个新连接放入ThreadLocal。执行完成commit后再恢复资源重新放入ThreadLocal中。

在suspend挂起,commit提交,rollback回滚时,都可以通过提供的接口在这些时机做一些程序员想要做的操作。

你可能感兴趣的:(Spring,spring)