SpringBoot配置全局事务

539 阅读2分钟
@Aspect
@Configuration
public class TransactionAdviceConfig {
/** * 配置方法过期时间,默认-1,永不超时 */
private final static int TX_METHOD_TIME_OUT = 10;/** * 全局事务位置配置 在哪些地方需要进行事务处理:具体如下 * 配置切入点表达式,
这里解释一下表达式的含义 
* 1.execution(): 表达式主体 
* 2.第一个*号:表示返回类型,*号表示所有的类型 
* 3.com.schcilin.goods.service表示切入点的包名 
* 4.第二个*号:表示实现包 
* 5.*(..)*号表示所有方法名,..表示所有类型的参数
 */private static final String POITCUT_EXPRESSION = "execution(* com.jt.service.*.*(..))";@Autowired/**
这里我看很多文档用的都是PlatformTransactionManager
看源码会发现,传这个参数的构造方法已经过时了
*/
private TransactionManager transactionManager;@Beanpublic 
TransactionInterceptor txadvice() {    
/** 配置事务管理规则     
nameMap声明具备需要管理事务的方法名.     这里使用
public void addTransactionalMethod(String methodName, TransactionAttribute attr)     
*/   
NameMatchTransactionAttributeSource source = new NameMatchTransactionAttributeSource();    
Map<String, TransactionAttribute> nameMap = new HashMap<>(16);    
/*只读事物、不做更新删除等*/    /*事务管理规则*/    
RuleBasedTransactionAttribute readOnlyRule = new RuleBasedTransactionAttribute();    
/*设置当前事务是否为只读事务,true为只读*/    
readOnlyRule.setReadOnly(true);    
/* transactiondefinition 定义事务的隔离级别;     
*  PROPAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,
加入到这个事务中*/    
readOnlyRule.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);    
RuleBasedTransactionAttribute requireRule = new RuleBasedTransactionAttribute();    
/*抛出异常后执行切点回滚*/    
requireRule.setRollbackRules(Collections.singletonList
                        (new RollbackRuleAttribute(Exception.class)));    
/*PROPAGATION_REQUIRED:事务隔离性为1,若当前存在事务,
则加入该事务;如果当前没有事务,则创建一个新的事务。这是默认值。 
*/    
requireRule.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);    
/*设置事务失效时间,超过10秒,可根据hytrix,则回滚事务*/    
requireRule.setTimeout(TX_METHOD_TIME_OUT);    
nameMap.put("add*", requireRule);    
nameMap.put("save*", requireRule);    
nameMap.put("insert*", requireRule);    
nameMap.put("update*", requireRule);    
nameMap.put("delete*", requireRule);    
nameMap.put("remove*", requireRule);    
/*进行批量操作时*/    
nameMap.put("batch*", requireRule);    
nameMap.put("get*", readOnlyRule);    
nameMap.put("query*", readOnlyRule);    
nameMap.put("find*", readOnlyRule);    
nameMap.put("select*", readOnlyRule);    
nameMap.put("count*", readOnlyRule);    
source.setNameMap(nameMap);    
return new TransactionInterceptor(transactionManager, source);
}

/** * 设置切面=切点pointcut+通知TxAdvice * * @return */
@Bean
public Advisor txAdviceAdvisor() {    
    AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();   
    pointcut.setExpression(POITCUT_EXPRESSION);    
    return new DefaultPointcutAdvisor(pointcut, txadvice());
}

转载地址:www.cnblogs.com/hnusthuyanh…

说明:我在网上看了很多文档,用的基本上都是一样的,我自己试过都不行。

/**
这里我看很多文档用的都是PlatformTransactionManager
应该换成TransactionManager
看源码会发现,传这个参数的构造方法已经过时了
*/
private TransactionManager transactionManager;