按照以前的方式控制事务只需要在业务层方法上添加注解
@Transactional
就可以控制事务了,那么为什么这个注解会有这么强大的功能呢?处理流程大概是个什么样子的呢?怀着好奇的心理翻阅了许许多多的资料总结一下,有不对的希望大佬指出来
简单流程:
1、拦截Transactional注解
2、获取事务状态
3、监听异常
4、提交/回滚
ps:当然真正事务处理逻辑肯定没有这么简单
了解了基本流程之后我们试着写一个自己事务处理
1.我们试着写一个自己的注解
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyTransactional {
}
我这里设置的作用域是在方法上,可以自定义到类上或者其他上也可以加点儿属性
2.有了自定义注解之后我,我们现在该在aop上拦截这个注解了。
/**
* 获取事务源
*/
@Resource
private DataSourceTransactionManager dataSourceTransactionManager;
private TransactionStatus transactionStatus;
/**
* 对MyTransactional的方法环绕通知
* @param joinPoint
* @throws Throwable
*/
@Around("@annotation(com.nhdc.logic.invest.front.comon.constant.MyTransactional)")
public void doPoint(ProceedingJoinPoint joinPoint) throws Throwable {
//获取事务状态
transactionStatus = dataSourceTransactionManager.getTransaction(new DefaultTransactionAttribute());
//继续执行方法
joinPoint.proceed();
//提交事务
dataSourceTransactionManager.commit(transactionStatus);
}
/***
* 当方法发生异常的时候触发 此时事务回滚
*/
@AfterThrowing("@annotation(com.nhdc.logic.invest.front.comon.constant.MyTransactional)")
public void rollback(){
if(transactionStatus != null){
transactionUtil.rollback(transactionStatus);
}
}
该AOP做了两件事情
1、环绕通知添加了自定义注解的方法 收集事务 提交事务
2、监听添加了自定义注解方法 如果抛出异常则回滚
注意:如果方法里 try catch了异常 则监听异常失效