標籤:try return run autowire 比較 list manage nconf 使用
最近一個官網的項目,我在service層有兩個添加資料的操作,很意外報錯了,然後就研究到了事務
之前只是知道聲明式事務和編程式事務,編程式的事務顯得比較麻煩,一般都是使用聲明式事務..
spring提供了很多種配置方式:
編程式事務:
開啟事務;
try{
更新或添加操作;
提交;
}catch(..){
復原;
}
聲明式事務:
提交,復原的操作寫在了一個代理類裡頭,在執行事務方法之前開啟事務,在執行完方法之前提交或者復原事務
1 給每個bean(service類)配置一個代理類
2 所有service類公用一個代理類
3 攔截器(aop的方式)
4 全註解(在service類加上Transaction)
注 : spring只對runtiomException才會復原(經測試的) 提供了對應的屬性設定異常類型
下面是我項目裡頭事務的配置 (config配置呢) :
/** * 註解聲明式事務配置(相當於上述的aop方式的配置) * @author liyong * */@Configurationpublic class TxAdviceTransactionConfig { private static final String AOP_POINTCUT_EXPRESSION = "execution(* com.mike.mihome.*.service..*.*(..))"; @Autowired private PlatformTransactionManager transactionManager; @Bean public TransactionInterceptor txAdvice(){ NameMatchTransactionAttributeSource source = new NameMatchTransactionAttributeSource(); //唯讀事務,不做更新操作 RuleBasedTransactionAttribute readOnlyTx = new RuleBasedTransactionAttribute(); readOnlyTx.setReadOnly(true); readOnlyTx.setPropagationBehavior(TransactionDefinition.PROPAGATION_NOT_SUPPORTED); //當前存在事務就使用當前事務,當前不存在事務就建立一個新的事務 RuleBasedTransactionAttribute requiredTx = new RuleBasedTransactionAttribute();// requiredTx.setRollbackRules(Collections.singletonList(new RollbackRuleAttribute(Exception.class))); //設定異常類型 requiredTx.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); requiredTx.setTimeout(10000); Map<String, TransactionAttribute> txMap = new HashMap<String, TransactionAttribute>(); txMap.put("query*", readOnlyTx); txMap.put("get*", readOnlyTx); txMap.put("*", requiredTx); source.setNameMap(txMap); TransactionInterceptor txAdvice = new TransactionInterceptor(transactionManager, source); return txAdvice; } @Bean public Advisor txAdviceAdvisor() { AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut(); pointcut.setExpression(AOP_POINTCUT_EXPRESSION); return new DefaultPointcutAdvisor(pointcut, txAdvice()); }}
搞懂spring事務