apache / incubator-seata

:fire: Seata is an easy-to-use, high-performance, open source distributed transaction solution.
https://seata.apache.org/
Apache License 2.0
25.25k stars 8.77k forks source link

生成lock_table表row_key不完整导致插入失败 #6552

Closed kaisa-zzh closed 4 months ago

kaisa-zzh commented 4 months ago

Ⅰ. Issue Description

RM注册成功,seata-seaver在写入lock_table表时,生成的row_key截取了部分长度的id,导致lock_table表数据写入失败

Ⅱ. Describe what happened

If there is an exception, please attach the exception trace:

seata服务端日志:
2024-05-16 16:08:14.946 ERROR --- [ServerHandlerThread_1_39_500] [io.seata.core.exception.AbstractExceptionHandler] [exceptionHandleTemplate] [10.200.7.25:18093:18535623205631387]: Catch TransactionException while do RPC, request: BranchRegisterRequest{xid='10.200.7.25:18093:18535623205631387', branchType=AT, resourceId='jdbc:mysql://10.200.8.1:3306/yxy1', lockKey='bpm_instance:449798968234475524;undo_log:577288', applicationData='{"autoCommit":false,"skipCheckLock":true}'}
==>
io.seata.core.exception.TransactionException: branch register request failed. xid=10.200.7.25:18093:18535623205631387, msg=Duplicate entry 'jdbc:mysql://10.200.8.1:3306/yxy1^^^bpm_instance^^^4497989682344' for key 'PRIMARY'
        at io.seata.server.AbstractTCInboundHandler$4.execute(AbstractTCInboundHandler.java:187) ~[classes!/:1.8.0]
        at io.seata.server.AbstractTCInboundHandler$4.execute(AbstractTCInboundHandler.java:179) ~[classes!/:1.8.0]
        at io.seata.core.exception.AbstractExceptionHandler.exceptionHandleTemplate(AbstractExceptionHandler.java:131) ~[seata-core-1.8.0.jar:1.8.0]
        at io.seata.server.AbstractTCInboundHandler.handle(AbstractTCInboundHandler.java:179) [classes!/:1.8.0]
        at io.seata.core.protocol.transaction.BranchRegisterRequest.handle(BranchRegisterRequest.java:136) [seata-core-1.8.0.jar:1.8.0]
        at io.seata.server.coordinator.DefaultCoordinator.onRequest(DefaultCoordinator.java:523) [classes!/:1.8.0]
        at io.seata.core.rpc.processor.server.ServerOnRequestProcessor.handleRequestsByMergedWarpMessage(ServerOnRequestProcessor.java:288) [seata-core-1.8.0.jar:1.8.0]
        at io.seata.core.rpc.processor.server.ServerOnRequestProcessor.onRequestMessage(ServerOnRequestProcessor.java:182) [seata-core-1.8.0.jar:1.8.0]
        at io.seata.core.rpc.processor.server.ServerOnRequestProcessor.process(ServerOnRequestProcessor.java:122) [seata-core-1.8.0.jar:1.8.0]
        at io.seata.core.rpc.netty.AbstractNettyRemoting.lambda$processMessage$2(AbstractNettyRemoting.java:281) [seata-core-1.8.0.jar:1.8.0]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[na:1.8.0_261]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[na:1.8.0_261]
        at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.76.Final.jar:4.1.76.Final]
        at java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_261]
Caused by: io.seata.common.exception.StoreException: Duplicate entry 'jdbc:mysql://10.200.8.1:3306/yxy1^^^bpm_instance^^^4497989682344' for key 'PRIMARY'
        at io.seata.server.storage.db.lock.LockStoreDataBaseDAO.acquireLock(LockStoreDataBaseDAO.java:199) ~[classes!/:1.8.0]
        at io.seata.server.storage.db.lock.DataBaseLocker.acquireLock(DataBaseLocker.java:64) ~[classes!/:1.8.0]
        at io.seata.server.lock.AbstractLockManager.acquireLock(AbstractLockManager.java:65) ~[classes!/:1.8.0]
        at io.seata.server.session.BranchSession.lock(BranchSession.java:287) ~[classes!/:1.8.0]
        at io.seata.server.transaction.at.ATCore.branchSessionLock(ATCore.java:77) ~[classes!/:1.8.0]
        at io.seata.server.coordinator.AbstractCore.lambda$branchRegister$0(AbstractCore.java:83) ~[classes!/:1.8.0]
        at io.seata.server.storage.db.session.DataBaseSessionManager.lockAndExecute(DataBaseSessionManager.java:191) ~[classes!/:1.8.0]
        at io.seata.server.session.SessionHolder.lockAndExecute(SessionHolder.java:367) ~[classes!/:1.8.0]
        at io.seata.server.coordinator.AbstractCore.branchRegister(AbstractCore.java:77) ~[classes!/:1.8.0]
        at io.seata.server.coordinator.DefaultCore.branchRegister(DefaultCore.java:103) ~[classes!/:1.8.0]
        at io.seata.server.coordinator.DefaultCoordinator.doBranchRegister(DefaultCoordinator.java:294) [classes!/:1.8.0]
        at io.seata.server.AbstractTCInboundHandler$4.execute(AbstractTCInboundHandler.java:184) ~[classes!/:1.8.0]
        ... 13 common frames omitted
Caused by: java.sql.BatchUpdateException: Duplicate entry 'jdbc:mysql://10.200.8.1:3306/yxy1^^^bpm_instance^^^4497989682344' for key 'PRIMARY'
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_261]
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_261]
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_261]
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_261]
        at com.mysql.jdbc.Util.handleNewInstance(Util.java:425) ~[mysql-connector-java-5.1.42.jar:5.1.42]
        at com.mysql.jdbc.Util.getInstance(Util.java:408) ~[mysql-connector-java-5.1.42.jar:5.1.42]
        at com.mysql.jdbc.SQLError.createBatchUpdateException(SQLError.java:1162) ~[mysql-connector-java-5.1.42.jar:5.1.42]
        at com.mysql.jdbc.PreparedStatement.executeBatchedInserts(PreparedStatement.java:1587) ~[mysql-connector-java-5.1.42.jar:5.1.42]
        at com.mysql.jdbc.PreparedStatement.executeBatchInternal(PreparedStatement.java:1253) ~[mysql-connector-java-5.1.42.jar:5.1.42]
        at com.mysql.jdbc.StatementImpl.executeBatch(StatementImpl.java:970) ~[mysql-connector-java-5.1.42.jar:5.1.42]
        at com.alibaba.druid.pool.DruidPooledPreparedStatement.executeBatch(DruidPooledPreparedStatement.java:565) ~[druid-1.2.7.jar:1.2.7]
        at io.seata.server.storage.db.lock.LockStoreDataBaseDAO.doAcquireLocks(LockStoreDataBaseDAO.java:371) ~[classes!/:1.8.0]
        at io.seata.server.storage.db.lock.LockStoreDataBaseDAO.acquireLock(LockStoreDataBaseDAO.java:187) ~[classes!/:1.8.0]
        ... 24 common frames omitted
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'jdbc:mysql://10.200.8.1:3306/yxy1^^^bpm_instance^^^4497989682344' for key 'PRIMARY'
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_261]
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_261]
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_261]
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_261]
        at com.mysql.jdbc.Util.handleNewInstance(Util.java:425) ~[mysql-connector-java-5.1.42.jar:5.1.42]
        at com.mysql.jdbc.Util.getInstance(Util.java:408) ~[mysql-connector-java-5.1.42.jar:5.1.42]
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:935) ~[mysql-connector-java-5.1.42.jar:5.1.42]
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3973) ~[mysql-connector-java-5.1.42.jar:5.1.42]
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3909) ~[mysql-connector-java-5.1.42.jar:5.1.42]
        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2527) ~[mysql-connector-java-5.1.42.jar:5.1.42]
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2680) ~[mysql-connector-java-5.1.42.jar:5.1.42]
        at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2490) ~[mysql-connector-java-5.1.42.jar:5.1.42]
        at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1858) ~[mysql-connector-java-5.1.42.jar:5.1.42]
        at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2079) ~[mysql-connector-java-5.1.42.jar:5.1.42]
        at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2013) ~[mysql-connector-java-5.1.42.jar:5.1.42]
        at com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5104) ~[mysql-connector-java-5.1.42.jar:5.1.42]
        at com.mysql.jdbc.PreparedStatement.executeBatchedInserts(PreparedStatement.java:1548) ~[mysql-connector-java-5.1.42.jar:5.1.42]
        ... 29 common frames omitted
<==

Ⅲ. Describe what you expected to happen

生成的row_key应为:jdbc:mysql://10.200.8.1:3306/yxy1^^^bpm_instance^^^449798968234475524 实际生成的row_key为:jdbc:mysql://10.200.8.1:3306/yxy1^^^bpm_instance^^^4497989682344

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

  1. seata集群,版本1.8,nacos作为注册和配置中心
  2. 集成activity
  3. 分支事务注册成功后,写lock_table失败

Minimal yet complete reproducer code (or URL to code):

Ⅴ. Anything else we need to know?

Ⅵ. Environment: