前言:
在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注解方法的增强
......
}