springboot项⽬事务配置@Transactional注解及AOP实现全局事务管理springboot项⽬事务配置 @Transactional注解及AOP实现全局事务管理
Hello啊,我是你们的杨洋啊,最近要新搭⼀个项⽬,正好写到了事务,那就跟⼤家聊聊实际⼯作中的事务的配置,那不说废话了,咱们正式开始,关于什么是事务之类的就不科普了
事务实现的⽅式:
1. @Transactional注解实现
2. 全局事务管理器
1.@Transactional注解实现
配置在类上:
@Service("menuService")
@Transactional(rollbackFor = Exception.class)
public class MenuServiceImpl implements MenuService {
@Resource
private MenuMapper menuMapper;
配置在⽅法上:(推荐)
public class MenuServiceImpl implements MenuService {
@Resource
private MenuMapper menuMapper;
@Override
public List<MenuDto>getMenuInfo(){
MenuInfo("1");
}
@Override
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
public int insertMenuInfo(List<MenuDto> menuDtoList){
int insertMenuNum = menuMapper.insertMenu(menuDtoList);
/*int a = 10/0;*/
return insertMenuNum;
}
}
那么有同学就要问了,如果你时配置在类跟⽅法上⾯呢,那肯定是⽅法上⾯的覆盖类上的,推荐⽅法上的原因是因为粒度更细。
2.全局事务管理器(强烈推荐)
package com.yang.demo.aop;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.aop.Advisor;
import org.springframework.aop.aspectj.AspectJExpressionPointcut;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import t.annotation.Bean;
import t.annotation.Configuration;
import ansaction.PlatformTransactionManager;
import ansaction.TransactionDefinition;
import ansaction.interceptor.*;
import javax.annotation.Resource;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
/**
* 全局事务管理器
*
* @author yanglei
* @date 2020/8/3
*/
@Aspect
@Configuration
public class TransactionalAopConfig {
/**
* 配置⽅法过期时间,默认-1,永不超时
*/
private final static int METHOD_TIME_OUT =5000;
/**
* 配置切⼊点表达式
*/
private static final String POINTCUT_EXPRESSION ="execution(* com.yang.demo.service..*.*(..))";
/**
* 事务管理器
*/
@Resource
private PlatformTransactionManager transactionManager;
@Bean
public TransactionInterceptor txAdvice(){
/*事务管理规则,声明具备事务管理的⽅法名**/
NameMatchTransactionAttributeSource source =new NameMatchTransactionAttributeSource();
/*只读事务,不做更新操作*/
RuleBasedTransactionAttribute readOnly =new RuleBasedTransactionAttribute();
readOnly.setReadOnly(true);
readOnly.setPropagationBehavior(TransactionDefinition.PROPAGATION_NOT_SUPPORTED);
/*当前存在事务就使⽤当前事务,当前不存在事务就创建⼀个新的事务*/
RuleBasedTransactionAttribute required =new RuleBasedTransactionAttribute();
/
*抛出异常后执⾏切点回滚,这边你可以更换异常的类型*/
required.setRollbackRules(Collections.singletonList(new RollbackRuleAttribute(Exception.class)));
/*PROPAGATION_REQUIRED:事务隔离性为1,若当前存在事务,则加⼊该事务;如果当前没有事务,则创建⼀个新的事务。这是默认值*/        required.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
/*设置事务失效时间,如果超过5秒,则回滚事务*/
required.setTimeout(METHOD_TIME_OUT);
Map<String, TransactionAttribute> attributesMap =new HashMap<>(30);
//设置增删改上传等使⽤事务
attributesMap.put("save*", required);
attributesMap.put("remove*", required);
attributesMap.put("update*", required);
attributesMap.put("batch*", required);
attributesMap.put("clear*", required);
attributesMap.put("add*", required);
attributesMap.put("append*", required);
attributesMap.put("modify*", required);
attributesMap.put("edit*", required);
attributesMap.put("insert*", required);
attributesMap.put("delete*", required);
attributesMap.put("do*", required);
attributesMap.put("create*", required);
attributesMap.put("import*", required);
/
/查询开启只读
attributesMap.put("select*", readOnly);
attributesMap.put("get*", readOnly);
attributesMap.put("get*", readOnly);
attributesMap.put("valid*", readOnly);
attributesMap.put("list*", readOnly);
attributesMap.put("count*", readOnly);
attributesMap.put("find*", readOnly);
attributesMap.put("load*", readOnly);
attributesMap.put("search*", readOnly);
source.setNameMap(attributesMap);
return new TransactionInterceptor(transactionManager, source);
}
/**
* 设置切⾯=切点pointcut+通知TxAdvice
*/
@Bean
public Advisor txAdviceAdvisor(){
/* 声明切点的⾯:切⾯就是通知和切⼊点的结合。通知和切⼊点共同定义了关于切⾯的全部内容——它的功能、在何时和何地完成其功能*/        AspectJExpressionPointcut pointcut =new AspectJExpressionPointcut();
/*声明和设置需要拦截的⽅法,⽤切点语⾔描写*/
pointcut.setExpression(POINTCUT_EXPRESSION);
/*设置切⾯=切点pointcut+通知TxAdvice*/
return new DefaultPointcutAdvisor(pointcut,txAdvice());
}
springboot aop
}
这边呢,根据⾃⼰的需求更改attributesMap的内容等
结论:我喜欢全局事务管理,嘿嘿
注意点:
1. 事务使⽤之前,要在启动类⾥⾯引⼊注解@EnableTransactionManagement
2. 如果要使⽤@Transactional注解,推荐配置在⽅法上,粒度细
3. 实际项⽬中还是推荐全局事务管理的,就怕有同事不写注解
4. 使⽤全局事务的时候,⽅法命名⼀定要在上述规范中,切勿出现奇葩命名

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。