前言:

  在Spring中,事务有两种实现方式:

  • 编程式事务管理:编程式事务管理使用底层源码可实现更细粒度的事务控制。即事务只攘括需要执行sql的那部分逻辑,这样做的优点是,在业务复杂的情况下,可以避免事务过于庞大,控制事务的自由度会更高。
  • 申明式事务管理:添加@Transactional注解,并定义传播机制+回滚策略。基于Spring AOP实现,本质式对方法前后进行拦截,然后目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况进行提交或者回滚事务。

为什么采用编程事务管理?

  采用什么技术偏向取决于当下及其未来业务发展的趋势,电商erp业务庞大且复杂,需要更加细粒度的事务管理机制,加上现在微服务采取的都是分布式,为了能够和自研的分布式事务框架做更好的融合,编程式事务管理是最佳的选择。

//TODO

如何实现编程式事务管理?

1.使用MethodInvocation 获取目标函数 2.继承AbstractPlatformTransactionManager 重写方法

Spring如何管理事务

一、注解配置:

1.定义事务管理器 2.注册事务驱动,将事务托管与Spring管理

@Configuration
public class Config implements TransactionManagementConfigurer {

    /**
     * mybatis 自行配置生成的数据源
     */
    @Autowired
    private DataSource dataSource;

    /**
     * 注册事务驱动,将事务管理器编入Spring事务使用
     * @return
     */
    public TransactionManager annotationDrivenTransactionManager() {
        System.out.println("设置事务驱动");
        return transactionManager();
    }

    /**
     * 自定义定义事务管理器,本质上是继承DataSourceTransactionManager
     * @return
     */
    @Bean
    public PlatformTransactionManager transactionManager() {
        System.out.println("加载事务管理器");
        return new TarsTransactionalManager(dataSource);
    }
}

二、事务关键类:

1.TransactionManager
事务管理器顶层基类,没有定义任务接口,纯粹用在驱动注入事务管理器的时候声明指定类型

@Configuration
public abstract class AbstractTransactionManagementConfiguration implements ImportAware {

	//声明事务管理器
	protected TransactionManager txManager;

	@Autowired(required = false)
	void setConfigurers(Collection<TransactionManagementConfigurer> configurers) {
//注入事务管理器
configurer.annotationDrivenTransactionManager();
	}
}

2.PlatformTransactionManager
定义了三个抽象方法,1.获取事务;2.提交事务;回滚事务

public interface PlatformTransactionManager extends TransactionManager {

	TransactionStatus getTransaction(@Nullable TransactionDefinition definition)
			throws TransactionException;

	void commit(TransactionStatus status) throws TransactionException;

	void rollback(TransactionStatus status) throws TransactionException;

}

3.AbstractPlatformTransactionManager
抽象类,实现了PlatformTransactionManager接口,并定义了大量关于事务的方法,包括事务的提交、回滚、挂起、恢复、超时时间设置等等,并提供了四个抽象方法供子类实现,

    protected Object doGetTransaction() throws TransactionException;

    protected void doBegin(Object transaction, TransactionDefinition definition) throws TransactionException;

    protected void doCommit(DefaultTransactionStatus status) throws TransactionException;

    protected void doRollback(DefaultTransactionStatus status) throws TransactionException;

4.DataSourceTransactionManager 继承AbstractPlatformTransactionManager,并实现了其父类的抽象方法,真正实现获取事务的连接、事务的提交、事务的回滚

5.TransactionInterceptor 开启注解@Transactional扫描后,对标记有Transactional方法的增强,TransactionInterceptor的顶层接口为MethodInterceptor,需要额外了解MethodInterceptor的作用

	public Object invoke(MethodInvocation invocation) throws Throwable {
//实际增加方法写在父类TransactionAspectSupport里面
 invokeWithinTransaction(invocation.getMethod(), targetClass, invocation::proceed);
	}

6.TransactionAspectSupport TransactionInterceptor的父类,实际对标有Transactional进行方法增强的类

	protected Object invokeWithinTransaction(Method method, @Nullable Class<?> targetClass,
	final InvocationCallback invocation) throws Throwable {
	//对标注有@Transactional注解方法的增强
	......
	}

自研分布式事务

采用技术

流程图