Spring事务实现

简介

  • Spring 事务处理模块是通过 AOP 功能 来实现声明式事务处理的,通过spring-tx.jar包内 TransactionProxyFactoryBean 类来使用 AOP 功能。
  • SpringBoot 的 autoconfigure 模块配置了启用事务,主要配置了 PlatformTransactionManager、TransactionTemplate 和代理方式。
  • ProxyTransactionManagementConfiguration 配置了 BeanFactoryTransactionAttributeSourceAdvisor,可作为分析源码的入口。

编程式使用

这是spring事务的最基本使用方式,声明式事务也是在这个基础上进行扩展。

TransactionManager transactionManager = new DataSourceTransactionManager();
TransactionDefiniton td = new DefaultTransactionDefinition();
// transactionManager 是某一个具体的 PlatformTransactionManager实现类 的对象
TransactionStatus ts = transactionManager.getTransaction(td);
try {
    // 这里是需要进行事务处理的方法调用
} catch (Exception e) {
    transactionManager.rollback(ts);
    throw e;
}
transactionManager.commit(ts);

TransactionManager

PlatformTransactionManager 是其中一个事务抽象,包括 DataSourceTransactionManager 等各种事务的实现,是执行事务的基本单元,并通过 TransactionSynchronizationManager 保存事务的状态。

TransactionTemplate

对外提供的api封装,具体实现还是调用TransactionManager,可配置隔离级别和传播方式,核心方法是execute方法。

TransactionSynchronizationManager

存储 TransactionManager 操作过程中的事务状态和用于扩展的 TransactionSynchronization 集合,都是静态方法,随便用。

TransactionSynchronization

TransactionSynchronizationAdapter 实现了此接口,用于扩展事务生命周期的各个操作,可以通过 TransactionSynchronizationManager 的 registerSynchronization 方法添加多个同步器。

事务后执行业务方案

注解式使用

@TransactionalEventListener

事务事件处理器 ,简化扩展

ApplicationListenerMethodTransactionalAdapter

用于监听事务内发送(如:eventPublisher.publishEvent(new StandardMessageEvent(joinPoint)))的事件,如果事件在事务内,动态创建监听器(根据 @TransactionalEventListener 配置,创建通过 TransactionSynchronization 的生命周期处理事件的监听器),否则原样将事件传递下去。

@Transactional

事务的切点,指定拦截的方法,AnnotationTransactionAttributeSource 是注解对应的解析类。

事务传播

事务传播是Spring提供的,通过 AbstractPlatformTransactionManager 的 getTransaction 实现,配置的值(隔离级别和传播方式)通过 TransactionTemplate 传递进去。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Spring 事务简介 Spring 本身并不实现事务,Spring事务 的本质 还是 底层数据库 对事务的...
    白袜子先生阅读 14,463评论 0 12
  • 对大多数Java开发者来说,Spring事务管理是Spring应用中最常用的功能,使用也比较简单。本文主要从三个方...
    sherlockyb阅读 8,396评论 0 18
  • spring事务(一) 编程式事务 知识导读 本地事务(autocommit=false)-----编程式事务--...
    立志java阅读 6,208评论 1 1
  • 写在最前 这些天看了一些关于Spring事务的文章,发现写的都很浅,基本上说一下事务特性和Spring事务传播行为...
    Snipers_onk阅读 6,842评论 0 1
  • 网上很多资料或组件都是完全重新实现事务管理,而本文选择改造Spring事务的提交过程,这样在即简化了集成成本,又不...
    giafei阅读 4,839评论 0 2