@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;