From 53e3dcc14d0d3164591c516e43df96509151afa7 Mon Sep 17 00:00:00 2001 From: chengliefeng Date: Mon, 19 Aug 2024 22:55:32 +0800 Subject: [PATCH] optimize: Upload the tcc fence transaction isolation level (#6679) --- .../org/apache/seata/common/Constants.java | 5 ++ .../TccActionInterceptorHandler.java | 10 ++++ .../seata/rm/tcc/utils/MethodUtils.java | 47 +++++++++++++++++++ 3 files changed, 62 insertions(+) create mode 100644 tcc/src/main/java/org/apache/seata/rm/tcc/utils/MethodUtils.java diff --git a/common/src/main/java/org/apache/seata/common/Constants.java b/common/src/main/java/org/apache/seata/common/Constants.java index 1c715b2dffe..d3a0ab512d2 100644 --- a/common/src/main/java/org/apache/seata/common/Constants.java +++ b/common/src/main/java/org/apache/seata/common/Constants.java @@ -101,6 +101,11 @@ public interface Constants { */ String TX_ACTION_CONTEXT = "actionContext"; + /** + * isolation + */ + String TX_ISOLATION = "isolation"; + /** * default charset name */ diff --git a/tcc/src/main/java/org/apache/seata/rm/tcc/interceptor/TccActionInterceptorHandler.java b/tcc/src/main/java/org/apache/seata/rm/tcc/interceptor/TccActionInterceptorHandler.java index acf84663c1d..3df7fdcbe92 100644 --- a/tcc/src/main/java/org/apache/seata/rm/tcc/interceptor/TccActionInterceptorHandler.java +++ b/tcc/src/main/java/org/apache/seata/rm/tcc/interceptor/TccActionInterceptorHandler.java @@ -38,7 +38,9 @@ import org.apache.seata.integration.tx.api.interceptor.TwoPhaseBusinessActionParam; import org.apache.seata.integration.tx.api.interceptor.handler.AbstractProxyInvocationHandler; import org.apache.seata.rm.tcc.api.TwoPhaseBusinessAction; +import org.apache.seata.rm.tcc.utils.MethodUtils; import org.slf4j.MDC; +import org.springframework.transaction.annotation.Transactional; import static org.apache.seata.common.ConfigurationKeys.TCC_ACTION_INTERCEPTOR_ORDER; @@ -82,6 +84,7 @@ protected Object doInvoke(InvocationWrapper invocation) throws Throwable { } try { TwoPhaseBusinessActionParam businessActionParam = createTwoPhaseBusinessActionParam(businessAction); + initTransactionalAnnotationContext(method, targetBean, businessActionParam.getBusinessActionContext()); //Handler the TCC Aspect, and return the business result return actionInterceptorHandler.proceed(method, invocation.getArguments(), xid, businessActionParam, invocation::proceed); @@ -99,6 +102,13 @@ protected Object doInvoke(InvocationWrapper invocation) throws Throwable { return invocation.proceed(); } + private void initTransactionalAnnotationContext(Method method, Object targetBean, Map businessActionContext) { + Transactional transactionalAnnotation = MethodUtils.getTransactionalAnnotationByMethod(method, targetBean); + if (transactionalAnnotation != null) { + businessActionContext.put(Constants.TX_ISOLATION, transactionalAnnotation.isolation().value()); + } + } + private Annotation parseAnnotation(Method methodKey) throws NoSuchMethodException { Annotation result = parseAnnotationCache.computeIfAbsent(methodKey, method -> { Annotation twoPhaseBusinessAction = method.getAnnotation(getAnnotationClass()); diff --git a/tcc/src/main/java/org/apache/seata/rm/tcc/utils/MethodUtils.java b/tcc/src/main/java/org/apache/seata/rm/tcc/utils/MethodUtils.java new file mode 100644 index 00000000000..a3c6a758e60 --- /dev/null +++ b/tcc/src/main/java/org/apache/seata/rm/tcc/utils/MethodUtils.java @@ -0,0 +1,47 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.seata.rm.tcc.utils; + +import java.lang.reflect.Method; + +import org.apache.seata.common.exception.ShouldNeverHappenException; +import org.springframework.core.annotation.AnnotatedElementUtils; +import org.springframework.transaction.annotation.Transactional; + + + +public class MethodUtils { + /** + * Retrieve the Transactional annotation of a business method + * @param interfaceMethod interface method object + * @param targetTCCBean target tcc bean + * @return the @Transactional annotation + */ + public static Transactional getTransactionalAnnotationByMethod(Method interfaceMethod, Object targetTCCBean) { + String methodName = interfaceMethod.getName(); + Class[] parameterTypes = interfaceMethod.getParameterTypes(); + + Class clazz = targetTCCBean.getClass(); + Method implementationMethod; + try { + implementationMethod = clazz.getMethod(methodName, parameterTypes); + } catch (NoSuchMethodException e) { + throw new ShouldNeverHappenException(e); + } + return AnnotatedElementUtils.findMergedAnnotation(implementationMethod, Transactional.class); + } +}