Skip to content

全局锁的键值与 undo_log 记录中的值不一致导致回滚失败 #7738

@Tenormis

Description

@Tenormis

Check Ahead

  • I have searched the issues of this repository and believe that this is not a duplicate.

  • I am willing to try to fix this bug myself.

Ⅰ. Issue Description

AT 模式下,使用 BINARY(16) 作为主键时,全局锁(TC lock_table)中记录的主键值为 Java 数组对象的地址(如:[B@1b57bff9),与微服务 undo_log 中记录的值不一致,从而导致全局事务回滚失败。

Ⅱ. Describe what happened

日志内容比较长,重点关注以下三点即可:

  1. 全局事务回滚失败原因:Branch session rollback failed because of dirty undo log, please delete the relevant undolog after manually calibrating the data. xid = 10.10.0.235:8091:3936855491796426755 branchId = 3936855491796426757
  2. 微服务 B undo_logafterImageorder_id 值为 ["[B", "AAZ+QXhzAAIAAm1C98wRUw=="]
  3. TC lock_tablepk 记录的值为 [B@1b57bff9
  • 微服务 B 日志:

    > 2025-10-28 14:40:23.667  INFO [nio-8082-exec-3] io.seata.tm.api.DefaultGlobalTransaction         : Begin new global transaction [10.10.0.235:8091:3936855491796426755]
    > 2025-10-28 14:40:23.669 DEBUG [nio-8082-exec-3] p.t.h.orderservice.dal.mapper.OrderMapper.insert : [MYBATIS] ==>  Preparing: INSERT order_tbl(order_id, user_id, product_name) VALUES (?, ?, ?);
    > 2025-10-28 14:40:23.669 DEBUG [nio-8082-exec-3] p.t.h.orderservice.dal.mapper.OrderMapper.insert : [MYBATIS] ==> Parameters: [B@1f3d7157(byte[]), [B@1b02e668(byte[]), porsche2(String)
    > 2025-10-28 14:40:23.719  INFO [nio-8082-exec-3] io.seata.rm.AbstractResourceManager              : branch register success, xid:10.10.0.235:8091:3936855491796426755, branchId:3936855491796426757, lockKeys:order_tbl:[B@1b57bff9
    > 2025-10-28 14:40:23.725 DEBUG [nio-8082-exec-3] p.t.h.orderservice.dal.mapper.OrderMapper.insert : [MYBATIS] <==    Updates: 1
    > 2025-10-28 14:40:23.725 DEBUG [nio-8082-exec-3] p.t.h.apiclient.service.RemoteUserService        : [RemoteUserService#pay] ---> POST http://user-service/user/pay?userId=AAAF4ubFAAEBgPBBjKfDKw%3D%3D&money=190000 HTTP/1.1
    > 2025-10-28 14:40:23.834 DEBUG [nio-8082-exec-3] p.t.h.apiclient.service.RemoteUserService        : [RemoteUserService#pay] <--- HTTP/1.1 500  (108ms)
    > 2025-10-28 14:40:23.843  INFO [nio-8082-exec-3] io.seata.tm.api.DefaultGlobalTransaction         : transaction 10.10.0.235:8091:3936855491796426755 will be rollback
    > 2025-10-28 14:40:23.862  INFO [h_RMROLE_1_2_32] i.s.c.r.p.client.RmBranchRollbackProcessor       : rm handle branch rollback process:BranchRollbackRequest{xid='10.10.0.235:8091:3936855491796426755', branchId=3936855491796426757, branchType=AT, resourceId='jdbc:mysql://tm.pc.dev.main.mysql-mst:3306/order_db', applicationData='{"skipCheckLock":true}'}
    > 2025-10-28 14:40:23.864  INFO [h_RMROLE_1_2_32] io.seata.rm.AbstractRMHandler                    : Branch Rollbacking: 10.10.0.235:8091:3936855491796426755 3936855491796426757 jdbc:mysql://tm.pc.dev.main.mysql-mst:3306/order_db
    > 2025-10-28 14:40:23.934  INFO [h_RMROLE_1_2_32] io.seata.rm.datasource.undo.AbstractUndoExecutor : compare row failed, rowKey [B@5219cc8a, reason [newRow is null]
    > 2025-10-28 14:40:23.947 ERROR [h_RMROLE_1_2_32] io.seata.rm.datasource.DataSourceManager         : branchRollback failed. branchType:[AT], xid:[10.10.0.235:8091:3936855491796426755], branchId:[3936855491796426757], resourceId:[jdbc:mysql://tm.pc.dev.main.mysql-mst:3306/order_db], applicationData:[{"skipCheckLock":true}]. reason:[Branch session rollback failed because of dirty undo log, please delete the relevant undolog after manually calibrating the data. xid = 10.10.0.235:8091:3936855491796426755 branchId = 3936855491796426757]
    > 2025-10-28 14:40:23.947  INFO [h_RMROLE_1_2_32] io.seata.rm.AbstractRMHandler                    : Branch Rollbacked result: PhaseTwo_RollbackFailed_Unretryable
    > 2025-10-28 14:40:23.960  INFO [nio-8082-exec-3] io.seata.tm.api.DefaultGlobalTransaction         : transaction end, xid = 10.10.0.235:8091:3936855491796426755
    > 2025-10-28 14:40:23.960  INFO [nio-8082-exec-3] io.seata.tm.api.DefaultGlobalTransaction         : [10.10.0.235:8091:3936855491796426755] rollback status: RollbackFailed
    > 2025-10-28 14:40:23.972  WARN [nio-8082-exec-3] io.seata.tm.api.DefaultFailureHandlerImpl        : Failed to rollback transaction[10.10.0.235:8091:3936855491796426755]
    feign.FeignException$InternalServerError: [500 ] during [POST] to [http://user-service/user/pay?userId=AAAF4ubFAAEBgPBBjKfDKw%3D%3D&money=190000] [RemoteUserService#pay(Tmid,BigDecimal)]: [{"timestamp":"2025-10-28T06:40:23.790+00:00","status":500,"error":"Internal Server Error","path":"/user/pay"}]
    	at feign.FeignException.serverErrorStatus(FeignException.java:250) ~[feign-core-11.10.jar:na]
    	at feign.FeignException.errorStatus(FeignException.java:197) ~[feign-core-11.10.jar:na]
    	at feign.FeignException.errorStatus(FeignException.java:185) ~[feign-core-11.10.jar:na]
    	at feign.codec.ErrorDecoder$Default.decode(ErrorDecoder.java:92) ~[feign-core-11.10.jar:na]
    	at feign.AsyncResponseHandler.handleResponse(AsyncResponseHandler.java:98) ~[feign-core-11.10.jar:na]
    	at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:141) ~[feign-core-11.10.jar:na]
    	at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:91) ~[feign-core-11.10.jar:na]
    	at feign.ReflectiveFeign$FeignInvocationHandler.invoke(ReflectiveFeign.java:100) ~[feign-core-11.10.jar:na]
    	at com.sun.proxy.$Proxy113.pay(Unknown Source) ~[na:na]
    	at per.tenormis.hellomicroservice.orderservice.controller.OrderController.createV2(OrderController.java:74) ~[classes/:na]
    	at per.tenormis.hellomicroservice.orderservice.controller.OrderController$$FastClassBySpringCGLIB$$4947e2ee.invoke(<generated>) ~[classes/:na]
    	at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.24.jar:5.3.24]
    	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793) [spring-aop-5.3.24.jar:5.3.24]
    	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) [spring-aop-5.3.24.jar:5.3.24]
    	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) [spring-aop-5.3.24.jar:5.3.24]
    	at io.seata.spring.annotation.GlobalTransactionalInterceptor$2.execute(GlobalTransactionalInterceptor.java:208) ~[seata-all-1.8.0.jar:1.8.0]
    	at io.seata.tm.api.TransactionalTemplate.execute(TransactionalTemplate.java:128) ~[seata-all-1.8.0.jar:1.8.0]
    	at io.seata.spring.annotation.GlobalTransactionalInterceptor.handleGlobalTransaction(GlobalTransactionalInterceptor.java:205) [seata-all-1.8.0.jar:1.8.0]
    	at io.seata.spring.annotation.GlobalTransactionalInterceptor.invoke(GlobalTransactionalInterceptor.java:175) [seata-all-1.8.0.jar:1.8.0]
    	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) [spring-aop-5.3.24.jar:5.3.24]
    	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) [spring-aop-5.3.24.jar:5.3.24]
    	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708) [spring-aop-5.3.24.jar:5.3.24]
    	at per.tenormis.hellomicroservice.orderservice.controller.OrderController$$EnhancerBySpringCGLIB$$2b6c81c9.createV2(<generated>) [classes/:na]
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_202]
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_202]
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_202]
    	at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_202]
    	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) [spring-web-5.3.24.jar:5.3.24]
    	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) [spring-web-5.3.24.jar:5.3.24]
    	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) [spring-webmvc-5.3.24.jar:5.3.24]
    	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) [spring-webmvc-5.3.24.jar:5.3.24]
    	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) [spring-webmvc-5.3.24.jar:5.3.24]
    	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) [spring-webmvc-5.3.24.jar:5.3.24]
    	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1071) [spring-webmvc-5.3.24.jar:5.3.24]
    	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:964) [spring-webmvc-5.3.24.jar:5.3.24]
    	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) [spring-webmvc-5.3.24.jar:5.3.24]
    	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) [spring-webmvc-5.3.24.jar:5.3.24]
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:696) [tomcat-embed-core-9.0.69.jar:4.0.FR]
    	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) [spring-webmvc-5.3.24.jar:5.3.24]
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:779) [tomcat-embed-core-9.0.69.jar:4.0.FR]
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) [tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) [tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) [tomcat-embed-websocket-9.0.69.jar:9.0.69]
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) [tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) [tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) [spring-web-5.3.24.jar:5.3.24]
    	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) [spring-web-5.3.24.jar:5.3.24]
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) [tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) [tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) [spring-web-5.3.24.jar:5.3.24]
    	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) [spring-web-5.3.24.jar:5.3.24]
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) [tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) [tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) [spring-web-5.3.24.jar:5.3.24]
    	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) [spring-web-5.3.24.jar:5.3.24]
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) [tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) [tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:177) [tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) [tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) [tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) [tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) [tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360) [tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399) [tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:891) [tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1784) [tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) [tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) [tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.69.jar:9.0.69]
    	at java.lang.Thread.run(Thread.java:748) [na:1.8.0_202]
    > 2025-10-28 14:40:23.994 ERROR [nio-8082-exec-3] o.a.c.c.C.[.[localhost].[/].[dispatcherServlet]  : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is feign.FeignException$InternalServerError: [500 ] during [POST] to [http://user-service/user/pay?userId=AAAF4ubFAAEBgPBBjKfDKw%3D%3D&money=190000] [RemoteUserService#pay(Tmid,BigDecimal)]: [{"timestamp":"2025-10-28T06:40:23.790+00:00","status":500,"error":"Internal Server Error","path":"/user/pay"}]] with root cause
    feign.FeignException$InternalServerError: [500 ] during [POST] to [http://user-service/user/pay?userId=AAAF4ubFAAEBgPBBjKfDKw%3D%3D&money=190000] [RemoteUserService#pay(Tmid,BigDecimal)]: [{"timestamp":"2025-10-28T06:40:23.790+00:00","status":500,"error":"Internal Server Error","path":"/user/pay"}]
    	at feign.FeignException.serverErrorStatus(FeignException.java:250) ~[feign-core-11.10.jar:na]
    	at feign.FeignException.errorStatus(FeignException.java:197) ~[feign-core-11.10.jar:na]
    	at feign.FeignException.errorStatus(FeignException.java:185) ~[feign-core-11.10.jar:na]
    	at feign.codec.ErrorDecoder$Default.decode(ErrorDecoder.java:92) ~[feign-core-11.10.jar:na]
    	at feign.AsyncResponseHandler.handleResponse(AsyncResponseHandler.java:98) ~[feign-core-11.10.jar:na]
    	at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:141) ~[feign-core-11.10.jar:na]
    	at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:91) ~[feign-core-11.10.jar:na]
    	at feign.ReflectiveFeign$FeignInvocationHandler.invoke(ReflectiveFeign.java:100) ~[feign-core-11.10.jar:na]
    	at com.sun.proxy.$Proxy113.pay(Unknown Source) ~[na:na]
    	at per.tenormis.hellomicroservice.orderservice.controller.OrderController.createV2(OrderController.java:74) ~[classes/:na]
    	at per.tenormis.hellomicroservice.orderservice.controller.OrderController$$FastClassBySpringCGLIB$$4947e2ee.invoke(<generated>) ~[classes/:na]
    	at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.24.jar:5.3.24]
    	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793) ~[spring-aop-5.3.24.jar:5.3.24]
    	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.24.jar:5.3.24]
    	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) ~[spring-aop-5.3.24.jar:5.3.24]
    	at io.seata.spring.annotation.GlobalTransactionalInterceptor$2.execute(GlobalTransactionalInterceptor.java:208) ~[seata-all-1.8.0.jar:1.8.0]
    	at io.seata.tm.api.TransactionalTemplate.execute(TransactionalTemplate.java:128) ~[seata-all-1.8.0.jar:1.8.0]
    	at io.seata.spring.annotation.GlobalTransactionalInterceptor.handleGlobalTransaction(GlobalTransactionalInterceptor.java:205) ~[seata-all-1.8.0.jar:1.8.0]
    	at io.seata.spring.annotation.GlobalTransactionalInterceptor.invoke(GlobalTransactionalInterceptor.java:175) ~[seata-all-1.8.0.jar:1.8.0]
    	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.24.jar:5.3.24]
    	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) ~[spring-aop-5.3.24.jar:5.3.24]
    	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708) ~[spring-aop-5.3.24.jar:5.3.24]
    	at per.tenormis.hellomicroservice.orderservice.controller.OrderController$$EnhancerBySpringCGLIB$$2b6c81c9.createV2(<generated>) ~[classes/:na]
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_202]
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_202]
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_202]
    	at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_202]
    	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-5.3.24.jar:5.3.24]
    	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) ~[spring-web-5.3.24.jar:5.3.24]
    	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-5.3.24.jar:5.3.24]
    	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.3.24.jar:5.3.24]
    	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.24.jar:5.3.24]
    	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.24.jar:5.3.24]
    	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1071) ~[spring-webmvc-5.3.24.jar:5.3.24]
    	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:964) ~[spring-webmvc-5.3.24.jar:5.3.24]
    	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.24.jar:5.3.24]
    	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.3.24.jar:5.3.24]
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:696) ~[tomcat-embed-core-9.0.69.jar:4.0.FR]
    	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.24.jar:5.3.24]
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:779) ~[tomcat-embed-core-9.0.69.jar:4.0.FR]
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) ~[tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.69.jar:9.0.69]
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.24.jar:5.3.24]
    	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.24.jar:5.3.24]
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.24.jar:5.3.24]
    	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.24.jar:5.3.24]
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.24.jar:5.3.24]
    	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.24.jar:5.3.24]
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:177) ~[tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) [tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) [tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) [tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) [tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360) [tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399) [tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:891) [tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1784) [tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) [tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) [tomcat-embed-core-9.0.69.jar:9.0.69]
    	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.69.jar:9.0.69]
    	at java.lang.Thread.run(Thread.java:748) [na:1.8.0_202]
    > 2025-10-28 14:40:34.994  INFO [actionRetry_1_1] io.seata.tm.api.DefaultFailureHandlerImpl        : transaction [10.10.0.235:8091:3936855491796426755] current status is [RollbackFailed]
    > 2025-10-28 14:40:45.982  INFO [actionRetry_1_1] io.seata.tm.api.DefaultFailureHandlerImpl        : transaction [10.10.0.235:8091:3936855491796426755] current status is [RollbackFailed]
    
  • 微服务 B undo_log

    branch_id xid context rollback_info log_status log_created log_modified
    3936855491796426757 10.10.0.235:8091:3936855491796426755 serializer=jackson&compressorType=NONE 如下 0 2025-10-28 14:40:23.817191 2025-10-28 14:40:23.817191
    {
      "@class": "io.seata.rm.datasource.undo.BranchUndoLog",
      "xid": "10.10.0.235:8091:3936855491796426755",
      "branchId": 3936855491796426757,
      "sqlUndoLogs": [
        "java.util.ArrayList",
        [
          {
            "@class": "io.seata.rm.datasource.undo.SQLUndoLog",
            "sqlType": "INSERT",
            "tableName": "order_tbl",
            "beforeImage": { "@class": "io.seata.rm.datasource.sql.struct.TableRecords$EmptyTableRecords", "tableName": "order_tbl", "rows": ["java.util.ArrayList", []] },
            "afterImage": {
              "@class": "io.seata.rm.datasource.sql.struct.TableRecords",
              "tableName": "order_tbl",
              "rows": [
                "java.util.ArrayList",
                [
                  {
                    "@class": "io.seata.rm.datasource.sql.struct.Row",
                    "fields": [
                      "java.util.ArrayList",
                      [
                        { "@class": "io.seata.rm.datasource.sql.struct.Field", "name": "order_id", "keyType": "PRIMARY_KEY", "type": -2, "value": ["[B", "AAZ+QXhzAAIAAm1C98wRUw=="] },
                        { "@class": "io.seata.rm.datasource.sql.struct.Field", "name": "user_id", "keyType": "NULL", "type": -2, "value": ["[B", "AAAF4ubFAAEBgPBBjKfDKw=="] },
                        { "@class": "io.seata.rm.datasource.sql.struct.Field", "name": "product_name", "keyType": "NULL", "type": 12, "value": "porsche2" }
                      ]
                    ]
                  }
                ]
              ]
            }
          }
        ]
      ]
    }
  • TC global_table

    xid transaction_id status application_id transaction_service_group transaction_name timeout begin_time application_data gmt_create gmt_modified
    10.10.0.235:8091:3936855491796426755 3936855491796426755 12 order-service my-tx-group createV2(per.tenormis.hellomicroservice.utils.tmid.Tmid, java.lang.String, java.math.BigDecimal) 60000 1761633623743 2025-10-28 14:40:23 2025-10-28 14:40:24
  • TC branch_table

    branch_id xid transaction_id resource_group_id resource_id branch_type status client_id application_data gmt_create gmt_modified
    3936855491796426757 10.10.0.235:8091:3936855491796426755 3936855491796426755 jdbc:mysql://tm.pc.dev.main.mysql-mst:3306/order_db AT 1 order-service:10.10.0.177:53441 "{""skipCheckLock"":true}" 2025-10-28 14:40:23.806005 2025-10-28 14:40:23.806005
  • TC lock_table

    row_key xid transaction_id branch_id resource_id table_name pk status gmt_create gmt_modified
    jdbc:mysql://tm.pc.dev.main.mysql-mst:3306/order_db^^^order_tbl^^^[B@1b57bff9 10.10.0.235:8091:3936855491796426755 3936855491796426755 3936855491796426757 jdbc:mysql://tm.pc.dev.main.mysql-mst:3306/order_db order_tbl [B@1b57bff9 1 2025-10-28 14:40:23 2025-10-28 14:40:23

Ⅲ. Describe what you expected to happen

Ⅳ. How to reproduce it (as minimally and precisely as possible)

  1. 业务表使用 BINARY(16) 类型作为主键(MySQL);
  2. 微服务 A 作为全局事务入口,调用微服务 B、微服务 C,微服务 B 执行成功,微服务 C 抛出异常。

Ⅴ. Anything else we need to know?

Q1:为什么要使用 BINARY(16) 作为主键?
A1:使用了自定义分布式 Id(类似雪花 Id),BIGINT 8 字节放不下,VARCHAR(24) 占存储空间且性能差。

Q2:为什么要自定义分布式 Id,不直接使用雪花 Id、UUID?
A2:雪花 Id 位宽较小、不含随机数,其可用年限仅 69 年左右,且在高并发场景下在存在时间回拨问题。UUID 非时间序,索引插入性能差(实际上用 UUID 也是存 BINARY(16))。

根因?:TM 使用 Jackson 序列化对象,MyBatis BINARY(16) → Java byte[] → Jackson base64 字符串。TC 使用 obj.toString() 得到的是 byte[] 的内存地址。

Ⅵ. Environment

  • Seata Server: 2.5.0
  • Seata Client: java, seata-all:1.8.0

Metadata

Metadata

Assignees

Labels

task: help-wantedExtra attention is neededtype: bugCategory issues or prs related to bug.

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions