incubator-seata icon indicating copy to clipboard operation
incubator-seata copied to clipboard

MYSQL数据库联合主键回滚异常

Open xuc623671 opened this issue 1 year ago • 1 comments

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

Ⅰ. 场景

数据库表使用4个字段建立联合主键,4个字段分别是(id,limit_type,limit_id,user_id),业务发生异常后,事务回滚失败,抛出异常!

Ⅱ. 异常信息

异常日志: ERROR [,] io.seata.rm.datasource.DataSourceManager[61] - [stacktrace]branchRollback failed. branchType:[AT], xid:[10.129.1.94:8091:3151204812672989873], branchId:[3153003322633989875], resourceId:[jdbc:mysql://xxx.xx.xx.1:31306/test], applicationData:[null]. reason:[Branch session rollback failed and try again later xid = 10.129.1.94:8091:3151204812672989873 branchId = 3153003322633989875 Index 1 out of bounds for length 1] io.seata.core.exception.BranchTransactionException: Branch session rollback failed and try again later xid = 10.129.1.94:8091:3151204812672989873 branchId = 3153003322633989875 Index 1 out of bounds for length 1 at io.seata.rm.datasource.undo.AbstractUndoLogManager.undo(AbstractUndoLogManager.java:370) at io.seata.rm.datasource.DataSourceManager.branchRollback(DataSourceManager.java:122) at io.seata.rm.AbstractRMHandler.doBranchRollback(AbstractRMHandler.java:125) at io.seata.rm.AbstractRMHandler$2.execute(AbstractRMHandler.java:67) at io.seata.rm.AbstractRMHandler$2.execute(AbstractRMHandler.java:63) at io.seata.core.exception.AbstractExceptionHandler.exceptionHandleTemplate(AbstractExceptionHandler.java:131) at io.seata.rm.AbstractRMHandler.handle(AbstractRMHandler.java:63) at io.seata.rm.DefaultRMHandler.handle(DefaultRMHandler.java:68) at io.seata.core.protocol.transaction.BranchRollbackRequest.handle(BranchRollbackRequest.java:35) at io.seata.rm.AbstractRMHandler.onRequest(AbstractRMHandler.java:150) at io.seata.core.rpc.processor.client.RmBranchRollbackProcessor.handleBranchRollback(RmBranchRollbackProcessor.java:63) at io.seata.core.rpc.processor.client.RmBranchRollbackProcessor.process(RmBranchRollbackProcessor.java:58) at io.seata.core.rpc.netty.AbstractNettyRemoting.lambda$processMessage$2(AbstractNettyRemoting.java:280) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.base/java.lang.Thread.run(Thread.java:833) Caused by: java.lang.IndexOutOfBoundsException: Index 1 out of bounds for length 1 at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64) at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70) at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:266) at java.base/java.util.Objects.checkIndex(Objects.java:359) at java.base/java.util.ArrayList.get(ArrayList.java:427) at io.seata.rm.datasource.undo.AbstractUndoExecutor.queryCurrentRecords(AbstractUndoExecutor.java:318) at io.seata.rm.datasource.undo.AbstractUndoExecutor.dataValidationAndGoOn(AbstractUndoExecutor.java:250) at io.seata.rm.datasource.undo.AbstractUndoExecutor.executeOn(AbstractUndoExecutor.java:118) at io.seata.rm.datasource.undo.AbstractUndoLogManager.undo(AbstractUndoLogManager.java:317) ... 16 common frames omitted ERROR [,] io.seata.rm.datasource.DataSourceManager[63] - branchRollback failed. branchType:[AT], xid:[10.129.1.94:8091:3151204812672989873], branchId:[3153003322633989875], resourceId:[jdbc:mysql://xxx.xxx.xxx.1:31306/test], applicationData:[null]. reason:[Branch session rollback failed and try again later xid = 10.129.1.94:8091:3151204812672989873 branchId = 3153003322633989875 Index 1 out of bounds for length 1] ERROR [,] io.seata.rm.datasource.DataSourceManager[63] - branchRollback failed. branchType:[AT], xid:[10.129.1.94:8091:3151204812672989873], branchId:[3153003322633989875], resourceId:[jdbc:mysql://xxx.xxx.xxx.1:31306/test], applicationData:[null]. reason:[Branch session rollback failed and try again later xid = 10.129.1.94:8091:3151204812672989873 branchId = 3153003322633989875 Index 1 out of bounds for length 1]

[其中根据debug定位到:rollbackinfo中的部分数据如下,四个联合有三个出现两次,一个出现一次

无标题

Ⅲ. Environment:

  • JDK version(e.g. java -version): 17
  • Seata client/server version: 2.0
  • Database version: mysql8.0
  • OS(e.g. uname -a):
  • Others:

xuc623671 avatar Feb 23 '24 08:02 xuc623671

https://github.com/apache/incubator-seata/pull/6077 我认为应该在这个pr中已经完成了修复,但是需要等待2.1,其次我认为在undolog回滚时,应该对回滚的field进行去重避免重复相同的field导致数组越界 I think the fix should have been done in this pr but need to wait for 2.1, and secondly I think when undolog rollback is done, the rollback fields should be de-duplicated to avoid duplicating the same fields causing the array to go out of bounds

funky-eyes avatar Feb 23 '24 08:02 funky-eyes