前言,有時候統(tǒng)一異常處理不太好,因為范圍太廣了,很多沒必要回滾的地方,因為拋了個異常都沒辦法繼續(xù)執(zhí)行別的代碼,所以,可以在需要開事務(wù)的地方添加 @Transation 注解開啟事務(wù)就行了。
springboot 項目中,一般兩種方式可以開啟事務(wù):
1. 只需要在類或者方法上添加注解 @Transaction 即可開啟事務(wù);
一般在service類標(biāo)簽上添加@Transactional,這樣可以將整個service類納入spring事務(wù)管理(所有的 public 方法納入),在每個業(yè)務(wù)方法執(zhí)行時都會開啟一個事務(wù),不過這些事務(wù)采用相同的管理方式。
在方法上添加這個注解也可以將方法納入事務(wù)(注意事項:@Transactional必須添加在public修飾的方法上)。
2. 在配置類中使用注解 @EnableTransactionManagement 然后指定開啟事務(wù)的地方,這樣即使不添加注解 @Transactional 也可以在指定地方開啟事務(wù)。
如果采用 @EnableTransactionManagement 開啟統(tǒng)一的事務(wù)控制器,可用代碼如下:
?文章來源:http://www.zghlxwxcb.cn/news/detail-568582.html
@Configuration
@EnableTransactionManagement
public class TransactionConfig {
/**
* 配置全局事務(wù)的切點為service層的所有方法 AOP切面表達式 可參考(https://blog.csdn.net/ycf921244819/article/details/106599489)
* TODO 設(shè)置service層所在位置
*/
private static final String AOP_POINTCUT_EXPRESSION = "execution (* com.xxx.service..*.*(..))";
private static final String[] REQUIRED_RULE_TRANSACTION = {"insert*", "create*", "add*", "save*","modify*", "update*", "del*", "delete*"};
private static final String[] READ_RULE_TRANSACTION = {"select*", "get*", "query*", "search*", "count*","detail*", "find*"};
/**
* 注入事務(wù)管理器
*/
@Autowired
private TransactionManager transactionManager;
/**
* 配置事務(wù)攔截器
*/
@Bean
public TransactionInterceptor txAdvice() {
RuleBasedTransactionAttribute txAttrRequired = new RuleBasedTransactionAttribute();
txAttrRequired.setName("REQUIRED事務(wù)");
//設(shè)置事務(wù)傳播機制,默認是PROPAGATION_REQUIRED:如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒有事務(wù),則創(chuàng)建一個新的事務(wù)
txAttrRequired.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
//設(shè)置異?;貪L為Exception 默認是RuntimeException
List rollbackRuleAttributes = new ArrayList<>();
rollbackRuleAttributes.add(new RollbackRuleAttribute(Exception.class));
txAttrRequired.setRollbackRules(rollbackRuleAttributes);
RuleBasedTransactionAttribute txAttrRequiredReadOnly = new RuleBasedTransactionAttribute();
txAttrRequiredReadOnly.setName("SUPPORTS事務(wù)");
//設(shè)置事務(wù)傳播機制,PROPAGATION_SUPPORTS:如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒有事務(wù),則以非事務(wù)的方式繼續(xù)運行
txAttrRequiredReadOnly.setPropagationBehavior(TransactionDefinition.PROPAGATION_SUPPORTS);
//設(shè)置異?;貪L為Exception 默認是RuntimeException
txAttrRequiredReadOnly.setRollbackRules(rollbackRuleAttributes);
txAttrRequiredReadOnly.setReadOnly(true);
/*事務(wù)管理規(guī)則,聲明具備事務(wù)管理的方法名*/
NameMatchTransactionAttributeSource source = new NameMatchTransactionAttributeSource();
//方法名規(guī)則限制,必須以下列開頭才會加入事務(wù)管理當(dāng)中
for (String s : REQUIRED_RULE_TRANSACTION) {
source.addTransactionalMethod(s, txAttrRequired);
}
//對于查詢方法,根據(jù)實際情況添加事務(wù)管理 可能存在查詢多個數(shù)據(jù)時,已查詢出來的數(shù)據(jù)剛好被改變的情況
for (String s : READ_RULE_TRANSACTION) {
source.addTransactionalMethod(s, txAttrRequired);
}
return new TransactionInterceptor((PlatformTransactionManager) transactionManager, source);
}
/**
* 設(shè)置切面
*/
@Bean
public Advisor txAdviceAdvisor() {
AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
pointcut.setExpression(AOP_POINTCUT_EXPRESSION);
return new DefaultPointcutAdvisor(pointcut, txAdvice());
}
}
寫在最后:
其實兩種方式都不需要寫 @EnableTransactionManagement 就能使用事務(wù);
為什么SpringBoot中不需要使用@EnableTransactionManagement就能使用事務(wù)?
答:因為在SpringBoot中自動裝配了此注解配置,所以已被默認啟用,自然不需要手動加上此注解。
?文章來源地址http://www.zghlxwxcb.cn/news/detail-568582.html
到了這里,關(guān)于SpringBoot 開啟事務(wù)的常用方式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!