SpringBoot中事务配置

1.一般性配置面向切面拦截的事务xml和注解两种,不解释看参数例子:
     注:
          两种方式比较:
           1)我还是比较推荐xml,一眼望去,清清楚楚。功能强大,不管是哪个类中哪个方法,
                只要你配置了事务就能生效
           2)注解方式,即使controller层配置了事务,切点为* com.test.controller.*.*(..),事务也不生    
                效,不知道为啥,@service层中的方法正常配置就有效。有坑。当然,对于@controller层
                中也要做事务,可以用@Transactional,不过一般人不需要controller开启事务吧
 
   1) xml类型:
       

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="        http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans.xsd        http://www.springframework.org/schema/tx        http://www.springframework.org/schema/tx/spring-tx.xsd        http://www.springframework.org/schema/aop        http://www.springframework.org/schema/aop/spring-aop.xsd">
 <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"></property>
 </bean>
 <tx:advice id="txAdvice" transaction-manager="txManager">
 <tx:attributes>
  <tx:method name="query*" propagation="SUPPORTS" read-only="true"></tx:method>
  <tx:method name="get*" propagation="SUPPORTS" read-only="true"></tx:method>
  <tx:method name="select*" propagation="SUPPORTS" read-only="true"></tx:method>
  <tx:method name="*" propagation="REQUIRED" rollback-for="Exception"></tx:method>
 </tx:attributes>
 </tx:advice>
 <aop:config>
   <aop:pointcut id="allManagerMethod" expression="execution (* com.test.service.*.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod" order="0"/>
 </aop:config>
</beans>
 
ps:
 
 
代入文件:
 
 
2)注解:
 java:
package com.test.aop;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import javax.sql.DataSource;
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.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource;
import org.springframework.transaction.interceptor.RollbackRuleAttribute;
import org.springframework.transaction.interceptor.RuleBasedTransactionAttribute;
import org.springframework.transaction.interceptor.TransactionAttribute;
import org.springframework.transaction.interceptor.TransactionInterceptor;
import com.test.domain.DqeProfileDefine;
@Configurationpublic
class TxAnoConfig {
 @Autowired
 private DataSource dataSource;
 @Bean("txManager")
 public DataSourceTransactionManager txManager() {
  return new DataSourceTransactionManager(dataSource);
 } /* 事务拦截器 */
 @Bean("txAdvice")   
 public  TransactionInterceptor txAdvice(DataSourceTransactionManager txManager){           
  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);
         RuleBasedTransactionAttribute requiredTx = new RuleBasedTransactionAttribute(TransactionDefinition.PROPAGATION_REQUIRED,             Collections.singletonList(new RollbackRuleAttribute(Exception.class)));
         requiredTx.setTimeout(5);
         Map<String, TransactionAttribute> txMap = new HashMap<>();
         txMap.put("add*", requiredTx);
         txMap.put("save*", requiredTx);
         txMap.put("insert*", requiredTx);
         txMap.put("update*", requiredTx);
         txMap.put("delete*", requiredTx);
         txMap.put("get*", readOnlyTx);
         txMap.put("query*", readOnlyTx);
         source.setNameMap( txMap );
        return new TransactionInterceptor(txManager ,source) ;
    } 
 /** 切面拦截规则 参数会自动从容器中注入 */
 @Bean
 public DefaultPointcutAdvisor defaultPointcutAdvisor(
   TransactionInterceptor txAdvice) {
  DefaultPointcutAdvisor pointcutAdvisor = new DefaultPointcutAdvisor();
  pointcutAdvisor.setAdvice(txAdvice);
  AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
  pointcut.setExpression("execution (* com.test.service.*.*(..))");
  pointcutAdvisor.setPointcut(pointcut);
  return pointcutAdvisor;
 }
}
 
代入pom.xml
     <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
     </dependency>
 
 
常用的:
  spring boot配置mybatis和事务管理
 
posted @ 2020-07-17 17:05  小窝蜗  阅读(1215)  评论(0编辑  收藏  举报