JAVA-AOP对存储过程事务进行回滚操作
编写要监控的注解
package io.hk.common.annotation;
import java.lang.annotation.*;
@Target({ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface TransactionAnnotation {
}
AOP切面
package io.hk.common.aspect;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import javax.annotation.Resource;
import java.util.Map;
@Aspect
@Component
public class TransactionAspect {
@Resource
private TransactionAspectSupport transactionAspectSupport;
public TransactionAspect() {
}
@Pointcut("@within(io.hk.common.annotation.TransactionAnnotation) || @annotation(io.hk.common.annotation.TransactionAnnotation)")
public void addPointCut() {
}
@Around("addPointCut()")
public Object around(ProceedingJoinPoint point) throws Throwable {
Object result = point.proceed();
TransactionStatus transactionStatus = TransactionAspectSupport.currentTransactionStatus();
// 如果存在事务且运行失败,则回滚
String code = ((Map)result).get("code").toString();
if ("1".equals(code)) {
// 手动回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
return result;
}
}
把注解放到要回滚的方法上

QA:
为什么新建一个新的事务(采用Propagation.REQUIRES_NEW的事务传播机制)???
手动回滚事务以后无法返回错误信息到前台(直接返回500)
Spring 源码分析:


采用Propagation.REQUIRES_NEW的事务传播机制,在serviceImpl层,每次都新生成一个事务

如果code != 0会把这个新事物回滚,程序也会继续执行下去。不会影响到把错误信息返回到前台(不会报上次看到的500问题)
实现事务的回滚 也保证了原子性
本文来自博客园,作者:skystrivegao,转载请注明原文链接:https://www.cnblogs.com/skystrive/p/18467241
整理不易,如果对您有所帮助 请点赞收藏,谢谢~
浙公网安备 33010602011771号