Springbootプロジェクトトランザクション構成@Transactional注記およびAOPグローバルトランザクション管理の実現
Springbootプロジェクトトランザクション構成@Transactional注記およびAOPグローバルトランザクション管理の実現
Helloああ、私はあなたたちの楊洋ですね.最近新しいプロジェクトを作ります.ちょうど事務を書きました.では、実際の仕事の事務の配置について話しましょう.それはくだらないことではありません.私たちは正式に始めました.何が事務なのかについては科学的ではありません.
トランザクションの実装方法:@Transactional注記 を実現グローバルトランザクションマネージャ 1.@Transactional注記実装
クラスに設定:
構成方法:(推奨)
では、クラスとメソッドの上に配置されている場合は、メソッドの上のカバークラスに違いありません.推奨メソッドの原因は、粒度が細いためです.
2.グローバルトランザクションマネージャ(強く推奨)
こちらは、自分のニーズに合わせてattributesMapの内容を変更するなど
結論:私はグローバル事務管理が好きで、へへ
注意点:トランザクションを使用する前に、起動クラスに注記@E n a b l e TransactionManagement を導入します.@Transactional注記を使用する場合は、メソッドに配置することを推奨します.粒度は です.実際のプロジェクトでは、グローバルトランザクション管理を推奨しています. グローバルトランザクションを使用する場合、メソッドのネーミングは必ず上記の仕様の中にあり、奇抜なネーミング は絶対に発生しないでください.
Helloああ、私はあなたたちの楊洋ですね.最近新しいプロジェクトを作ります.ちょうど事務を書きました.では、実際の仕事の事務の配置について話しましょう.それはくだらないことではありません.私たちは正式に始めました.何が事務なのかについては科学的ではありません.
トランザクションの実装方法:
クラスに設定:
@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の内容を変更するなど
結論:私はグローバル事務管理が好きで、へへ
注意点: