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]

Reply via email to