blog

Springbootプロジェクトのトランザクション設定 @グローバルトランザクション管理を実現するためのトランザクションアノテーションとAOP

その後、いくつかの学生は、あなたがその上のメソッドを持つクラスで構成する場合は、粒度が細かいので、それは推奨されるメソッドのオーバーライドクラスの上のメソッドでなければなりません、質問する必要がありま...

Jun 1, 2020 · 4 min. read
シェア

SpringBootプロジェクトのトランザクション設定 @グローバルトランザクション管理を実現するトランザクションアノテーションとAOP

こんにちはああ、私はあなたのヤンヤンああ、最近新しいプロジェクトを構築するために、それはトランザクションに書き込むために起こる、その後、トランザクションの設定の実際の作業についてあなたに話す、それはナンセンスを言っていない、我々は正式に開始し、トランザクションが何であるかなどについて、銅ではありません!

取引の実現方法:

  1. @Transactionalアノテーションの実装
  2. グローバルトランザクションマネージャ

@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;
 }
}

それから、何人かの学生は、もしあなたがその上のメソッドでクラス内の設定を行う場合、それは確かに推奨されるメソッドのオーバーライドクラスの上のメソッドであることを尋ねなければならない理由は、粒度がより詳細であるためです。

グローバルトランザクションマネージャ

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;
/**
 * グローバルトランザクションマネージャ
 *
 * 
 * @date 
 */
@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);
 }
 /**
 * ファセットを設定する=ポイントカット+TxAdviceを通知する
 */
 @Bean
 public Advisor txAdviceAdvisor() {
 /* カットポイントのファセットを宣言する:カットポイントは通知とエントリーポイントの組み合わせである。通知とエントリーポイントが一緒になって、ファセットに関するすべてのこと(何をするか、いつ、どこでその機能を実行するか)を定義する。*/
 AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
 /*インターセプトが必要なメソッドは、カットポイント言語の記述を使って宣言し、設定する*/
 pointcut.setExpression(POINTCUT_EXPRESSION);
 /*ファセットを設定する=ポイントカット+TxAdviceを通知する*/
 return new DefaultPointcutAdvisor(pointcut, txAdvice());
 }
}

こちら側は、自分の必要に応じて、attributesMapの内容を変更したりします。

結論:私はグローバル・トランザクション管理が好きです。

注意点

  1. トランザクションを使用するには、スターター・クラス内に @EnableTransactionManagement アノテーションを導入します。
  2. Transactionalアノテーションを使用する場合は、メソッドに細かく設定することをお勧めします。
  3. 一部の同僚が注釈を書かないことを恐れて、実際のプロジェクトまたは推奨されるグローバルトランザクション管理
  4. グローバル・トランザクションを使用する場合、メソッドの命名は上記の仕様に従わなければなりません。
Read next

PMP-第4章-プロジェクト統合管理

統合とは、調整と調和を意味します。プロジェクト・インテグレーション・マネジメントは、プロジェクト・マネジメントの中核をなすものであり、プロジェクトのさまざまな要素間の調整を達成し、相反する目標や競合する目標の最適なバランスを見出すことを目的としています。統合マネジメントが必要とされるのは、問題が最も発生しやすいのはプロジェクトの連結部分だからです。 プロジェクト内の統合は間違いなくプロジェクトマネジャーの責任であり、プロジェクト外の統合は少なくとも支援することがプロジェクトマネジャーの責任です。 統合の必要性

Jun 1, 2020 · 13 min read