Tenormis opened a new issue, #7738: URL: https://github.com/apache/incubator-seata/issues/7738
### Check Ahead - [x] I have searched the [issues](https://github.com/seata/seata/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 - 微服务 B 日志: ```Log > 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` | ```JSON { "@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. 微服务自定义分布式 Id(`Tmid`)、自定义 JSON 序列化器、自定义 MyBatis 序列化器: ```Java /** * 自定义 128 位(16 字节)的分布式 Id(类似雪花 Id) */ public final class Tmid implements Serializable { private final byte[] bytes; public Tmid(byte[] bytes) { // ... } public Tmid(String base64) { // ... } // ... @Override public String toString() { return Base64.getEncoder().encodeToString(this.bytes); } } /** * Jackson 自定义序列化器: * - serialize: 将 Tmid 序列化为 Base64 字符串 * - deserialize:从 Base64 字符串反序列化为 Tmid 对象 */ @Component public class TmidModule extends SimpleModule { public TmidModule() { addSerializer(Tmid.class, new JsonSerializer<Tmid>() { @Override public void serialize(@Nullable Tmid value, JsonGenerator gen, SerializerProvider serializers) throws IOException { if (value == null) gen.writeNull(); else gen.writeString(value.toString()); } }); addDeserializer(Tmid.class, new JsonDeserializer<Tmid>() { @Override public @Nullable Tmid deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { String text = p.getText(); return text == null ? null : new Tmid(text); } }); } } /** * MyBatis 自定义序列化器: * - serialize: 将 Tmid 序列化为 byte[] * - deserialize:从 byte[] 反序列化为 Tmid 对象 */ public class TmidTypeHandler extends BaseTypeHandler<Tmid> { @Override public void setNonNullParameter(PreparedStatement ps, int i, Tmid parameter, JdbcType jdbcType) throws SQLException { ps.setBytes(i, parameter.getBytes()); } @Override public @Nullable Tmid getNullableResult(ResultSet rs, String columnName) throws SQLException { byte[] bytes = rs.getBytes(columnName); return bytes == null ? null : new Tmid(bytes); } @Override public @Nullable Tmid getNullableResult(ResultSet rs, int columnIndex) throws SQLException { byte[] bytes = rs.getBytes(columnIndex); return bytes == null ? null : new Tmid(bytes); } @Override public @Nullable Tmid getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { byte[] bytes = cs.getBytes(columnIndex); return bytes == null ? null : new Tmid(bytes); } } ``` 3. 微服务 A 作为全局事务入口,调用微服务 B、微服务 C,微服务 B 执行成功,微服务 C 抛出异常。 ### Ⅴ. Anything else we need to know? Q1:为什么要使用 `BINARY(16)` 作为主键? A1:使用了自定义分布式 Id(类似雪花 Id),`BIGINT` 8 字节放不下,`VARCHAR(24)` 占存储空间性能差。 Q2:为什么要自定义分布式 Id,不直接使用雪花 Id? A2:雪花 Id 位宽较小、不含随机数,其可用年限仅 69 年左右,且在高并发场景下在存在时间回拨问题。 ### Ⅵ. Environment _No response_ -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected] --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
