SpringBoot事务配置规则

Spring Boot 事务配置规则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package com.tayu.interceptor;

import java.util.List;
import java.util.Properties;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.aop.Advisor;
import org.springframework.aop.aspectj.AspectJExpressionPointcut;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.interceptor.DefaultTransactionAttribute;
import org.springframework.transaction.interceptor.RollbackRuleAttribute;
import org.springframework.transaction.interceptor.RuleBasedTransactionAttribute;
import org.springframework.transaction.interceptor.TransactionInterceptor;

import com.google.common.collect.Lists;

@Aspect
@Configuration
public class TxAdviceInterceptor {

/**
* 需要事务管理的包路径
*/
private static final String AOP_POINTCUT_EXPRESSION = "execution(* com.tayu.service.*Impl.*(..))";

@Autowired
private PlatformTransactionManager transactionManager;


/*事务拦截类型*/
public TransactionInterceptor defaultTransactionInterceptor(PlatformTransactionManager transactionManager,
List<Class<? extends Exception>> additionalRollbackRuleExceptions) {
TransactionInterceptor transactionInterceptor = new TransactionInterceptor();
Properties transactionAttributes = new Properties();

List<RollbackRuleAttribute> rollbackRules = Lists.newArrayList();
rollbackRules.add(new RollbackRuleAttribute(Exception.class));
//回滚异常
if(additionalRollbackRuleExceptions != null && !additionalRollbackRuleExceptions.isEmpty()){
for (Class<? extends Exception> clazz : additionalRollbackRuleExceptions) {
rollbackRules.add(new RollbackRuleAttribute(clazz));
}
}
DefaultTransactionAttribute readOnlyTransactionAttributes =
new DefaultTransactionAttribute(TransactionDefinition.PROPAGATION_REQUIRED);
readOnlyTransactionAttributes.setReadOnly(true);

RuleBasedTransactionAttribute writeTransactionAttributes =
new RuleBasedTransactionAttribute(TransactionDefinition.PROPAGATION_REQUIRED, rollbackRules);

String readOnlyTransactionAttributesDefinition = readOnlyTransactionAttributes.toString();
String writeTransactionAttributesDefinition = writeTransactionAttributes.toString();
// read-only 声明只读方法开头
transactionAttributes.setProperty("is*", readOnlyTransactionAttributesDefinition);
transactionAttributes.setProperty("has*", readOnlyTransactionAttributesDefinition);
transactionAttributes.setProperty("get*", readOnlyTransactionAttributesDefinition);
transactionAttributes.setProperty("list*", readOnlyTransactionAttributesDefinition);
transactionAttributes.setProperty("search*", readOnlyTransactionAttributesDefinition);
transactionAttributes.setProperty("find*", readOnlyTransactionAttributesDefinition);
transactionAttributes.setProperty("count*", readOnlyTransactionAttributesDefinition);
// write et rollback-rule
transactionAttributes.setProperty("*", writeTransactionAttributesDefinition);

transactionInterceptor.setTransactionAttributes(transactionAttributes);
transactionInterceptor.setTransactionManager(this.transactionManager);
return transactionInterceptor;
}

/**
* 切面拦截规则
*/
@Bean
public Advisor txAdviceAdvisor() {
AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
pointcut.setExpression(AOP_POINTCUT_EXPRESSION);
return new DefaultPointcutAdvisor(pointcut, this.defaultTransactionInterceptor(this.transactionManager,null));
}

}