Springbootプロジェクトトランザクション構成@Transactional注記およびAOPグローバルトランザクション管理の実現


Springbootプロジェクトトランザクション構成@Transactional注記およびAOPグローバルトランザクション管理の実現
Helloああ、私はあなたたちの楊洋ですね.最近新しいプロジェクトを作ります.ちょうど事務を書きました.では、実際の仕事の事務の配置について話しましょう.それはくだらないことではありません.私たちは正式に始めました.何が事務なのかについては科学的ではありません.
トランザクションの実装方法:
  • @Transactional注記
  • を実現
  • グローバルトランザクションマネージャ
  • 1.@Transactional注記実装
    クラスに設定:
    @Service("menuService")
    @Transactional(rollbackFor = Exception.class)
    public class MenuServiceImpl implements MenuService {
    
        @Resource
        private MenuMapper menuMapper;
    

    構成方法:(推奨)
    public class MenuServiceImpl implements MenuService {
    
        @Resource
        private MenuMapper menuMapper;
    
        @Override
        public List<MenuDto> getMenuInfo() {
            return menuMapper.getMenuInfo("1");
        }
    
        @Override
        @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
        public int insertMenuInfo(List<MenuDto> menuDtoList) {
            int insertMenuNum = menuMapper.insertMenu(menuDtoList);
            /*int a = 10/0;*/
            return insertMenuNum;
        }
    }
    

    では、クラスとメソッドの上に配置されている場合は、メソッドの上のカバークラスに違いありません.推奨メソッドの原因は、粒度が細いためです.
    2.グローバルトランザクションマネージャ(強く推奨)
    package com.yang.demo.aop;
    
    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.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.transaction.PlatformTransactionManager;
    import org.springframework.transaction.TransactionDefinition;
    import org.springframework.transaction.interceptor.*;
    
    import javax.annotation.Resource;
    import java.util.Collections;
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     *        
     *
     * @author yanglei
     * @date 2020/8/3
     */
    @Aspect
    @Configuration
    public class TransactionalAopConfig {
    
        /**
         *         ,  -1,    
         */
        private final static int METHOD_TIME_OUT = 5000;
    
        /**
         *         
         */
        private static final String POINTCUT_EXPRESSION = "execution(* com.yang.demo.service..*.*(..))";
    
        /**
         *      
         */
        @Resource
        private PlatformTransactionManager transactionManager;
    
    
        @Bean
        public TransactionInterceptor txAdvice() {
            /*      ,            **/
            NameMatchTransactionAttributeSource source = new NameMatchTransactionAttributeSource();
            /*    ,      */
            RuleBasedTransactionAttribute readOnly = new RuleBasedTransactionAttribute();
            readOnly.setReadOnly(true);
            readOnly.setPropagationBehavior(TransactionDefinition.PROPAGATION_NOT_SUPPORTED);
            /*             ,                */
            RuleBasedTransactionAttribute required = new RuleBasedTransactionAttribute();
            /*           ,            */
            required.setRollbackRules(Collections.singletonList(new RollbackRuleAttribute(Exception.class)));
            /*PROPAGATION_REQUIRED:      1,       ,      ;        ,         。     */
            required.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
            /*        ,    5 ,     */
            required.setTimeout(METHOD_TIME_OUT);
            Map<String, TransactionAttribute> attributesMap = new HashMap<>(30);
            //            
            attributesMap.put("save*", required);
            attributesMap.put("remove*", required);
            attributesMap.put("update*", required);
            attributesMap.put("batch*", required);
            attributesMap.put("clear*", required);
            attributesMap.put("add*", required);
            attributesMap.put("append*", required);
            attributesMap.put("modify*", required);
            attributesMap.put("edit*", required);
            attributesMap.put("insert*", required);
            attributesMap.put("delete*", required);
            attributesMap.put("do*", required);
            attributesMap.put("create*", required);
            attributesMap.put("import*", required);
            //      
            attributesMap.put("select*", readOnly);
            attributesMap.put("get*", readOnly);
            attributesMap.put("valid*", readOnly);
            attributesMap.put("list*", readOnly);
            attributesMap.put("count*", readOnly);
            attributesMap.put("find*", readOnly);
            attributesMap.put("load*", readOnly);
            attributesMap.put("search*", readOnly);
            source.setNameMap(attributesMap);
            return new TransactionInterceptor(transactionManager, source);
        }
    
        /**
         *     =  pointcut+  TxAdvice
         */
        @Bean
        public Advisor txAdviceAdvisor() {
            /*       :             。                    ——    、           */
            AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
            /*            ,       */
            pointcut.setExpression(POINTCUT_EXPRESSION);
            /*    =  pointcut+  TxAdvice*/
            return new DefaultPointcutAdvisor(pointcut, txAdvice());
        }
    
    }
    
    

    こちらは、自分のニーズに合わせてattributesMapの内容を変更するなど
    結論:私はグローバル事務管理が好きで、へへ
    注意点:
  • トランザクションを使用する前に、起動クラスに注記@E n a b l e TransactionManagement
  • を導入します.
  • @Transactional注記を使用する場合は、メソッドに配置することを推奨します.粒度は
  • です.
  • 実際のプロジェクトでは、グローバルトランザクション管理を推奨しています.
  • グローバルトランザクションを使用する場合、メソッドのネーミングは必ず上記の仕様の中にあり、奇抜なネーミング
  • は絶対に発生しないでください.