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.08k stars 8.73k forks source link

1.8.0 branchRollback failed #6623

Closed mrsuibian closed 1 week ago

mrsuibian commented 2 weeks ago

[error,61] - [stacktrace]branchRollback failed. branchType:[AT], xid:[10.19.36.125:8092:5323786182041662173], branchId:[5323786182041662175], resourceId:[jdbc:mysql://10.19.36.124:3306/gtsy_bsi], applicationData:[{"skipCheckLock":true}]. reason:[Branch session rollback failed and try again later xid = 10.19.36.125:8092:5323786182041662173 branchId = 5323786182041662175 Index: 1, Size: 1] io.seata.core.exception.BranchTransactionException: Branch session rollback failed and try again later xid = 10.19.36.125:8092:5323786182041662173 branchId = 5323786182041662175 Index: 1, Size: 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:281) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.lang.Thread.run(Thread.java:748) Caused by: java.lang.IndexOutOfBoundsException: Index: 1, Size: 1 at java.util.ArrayList.rangeCheck(ArrayList.java:657) at java.util.ArrayList.get(ArrayList.java:433) 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

funky-eyes commented 2 weeks ago

请提供sql和表结构 Please provide SQL and table structure

funky-eyes commented 2 weeks ago

以及对应的undolog中的rollback info 也一并提交上来 And the rollback info in the corresponding undolog is also committed together.

mrsuibian commented 2 weeks ago

以及对应的undolog中的rollback info 也一并提交上来 And the rollback info in the corresponding undolog is also committed together.

这个错误是一直重试的时候偶尔发生的,我调试的时候发现出现失败的原因并不是这个异常导致的,如果表里面定义了联合主键,回滚会报错,在undolog里面联合主键里的另外一个字段会保存两次。 例如定义了联合主键id和packing_unit_id: { "@class": "io.seata.rm.datasource.undo.BranchUndoLog", "xid": "10.200.99.22:8091:8503330764517695498", "branchId": 8503330764517695499, "sqlUndoLogs": [ "java.util.ArrayList", [ { "@class": "io.seata.rm.datasource.undo.SQLUndoLog", "sqlType": "INSERT", "tableName": "goods", "beforeImage": { "@class": "io.seata.rm.datasource.sql.struct.TableRecords$EmptyTableRecords", "tableName": "goods", "rows": [ "java.util.ArrayList", [] ] }, "afterImage": { "@class": "io.seata.rm.datasource.sql.struct.TableRecords", "tableName": "goods", "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": "packing_unit_id", "keyType": "PRIMARY_KEY", "type": 4, "value": 14 }, { "@class": "io.seata.rm.datasource.sql.struct.Field", "name": "id", "keyType": "PRIMARY_KEY", "type": 4, "value": 5257 }, { "@class": "io.seata.rm.datasource.sql.struct.Field", "name": "name", "keyType": "NULL", "type": 12, "value": "ä¸ é¹ ä¹ é¾ ä¸ è ¶555ML" }, { "@class": "io.seata.rm.datasource.sql.struct.Field", "name": "code", "keyType": "NULL", "type": 12, "value": "012022" }, { "@class": "io.seata.rm.datasource.sql.struct.Field", "name": "international_bar_code", "keyType": "NULL", "type": 12, "value": "6934502302147" }, { "@class": "io.seata.rm.datasource.sql.struct.Field", "name": "specification", "keyType": "NULL", "type": 12, "value": "1*1" }, { "@class": "io.seata.rm.datasource.sql.struct.Field", "name": "packing_unit_id", "keyType": "PRIMARY_KEY", "type": 4, "value": 14 }, { "@class": "io.seata.rm.datasource.sql.struct.Field", "name": "goods_brand_id", "keyType": "NULL", "type": 4, "value": 25 }, { "@class": "io.seata.rm.datasource.sql.struct.Field", "name": "main_goods_supplier_id", "keyType": "NULL", "type": 4, "value": 65 }, { "@class": "io.seata.rm.datasource.sql.struct.Field", "name": "goods_category_id", "keyType": "NULL", "type": 4, "value": 81 }, { "@class": "io.seata.rm.datasource.sql.struct.Field", "name": "Purchase_price", "keyType": "NULL", "type": 3, "value": [ "java.math.BigDecimal", 1.04 ] }, { "@class": "io.seata.rm.datasource.sql.struct.Field", "name": "retail_price", "keyType": "NULL", "type": 3, "value": [ "java.math.BigDecimal", 3.0 ] }, { "@class": "io.seata.rm.datasource.sql.struct.Field", "name": "pricing_gross_margin", "keyType": "NULL", "type": 3, "value": [ "java.math.BigDecimal", 65.28 ] }, { "@class": "io.seata.rm.datasource.sql.struct.Field", "name": "purchase_factor", "keyType": "NULL", "type": 4, "value": 1 }, { "@class": "io.seata.rm.datasource.sql.struct.Field", "name": "delivery_factor", "keyType": "NULL", "type": 4, "value": 1 }, { "@class": "io.seata.rm.datasource.sql.struct.Field", "name": "wholesale_factor", "keyType": "NULL", "type": 4, "value": 1 }, { "@class": "io.seata.rm.datasource.sql.struct.Field", "name": "min_inventory", "keyType": "NULL", "type": 4, "value": 0 }, { "@class": "io.seata.rm.datasource.sql.struct.Field", "name": "max_inventory", "keyType": "NULL", "type": 4, "value": 9999 }, { "@class": "io.seata.rm.datasource.sql.struct.Field", "name": "input_tax_rate", "keyType": "NULL", "type": 3, "value": [ "java.math.BigDecimal", 13.0 ] }, { "@class": "io.seata.rm.datasource.sql.struct.Field", "name": "output_tax_rate", "keyType": "NULL", "type": 3, "value": [ "java.math.BigDecimal", 13.0 ] }, { "@class": "io.seata.rm.datasource.sql.struct.Field", "name": "min_inventory_warn", "keyType": "NULL", "type": 3, "value": [ "java.math.BigDecimal", 0.25 ] }, { "@class": "io.seata.rm.datasource.sql.struct.Field", "name": "max_inventory_warn", "keyType": "NULL", "type": 3, "value": [ "java.math.BigDecimal", 2.0 ] }, { "@class": "io.seata.rm.datasource.sql.struct.Field", "name": "dormant_inventory", "keyType": "NULL", "type": 4, "value": 15 }, { "@class": "io.seata.rm.datasource.sql.struct.Field", "name": "status", "keyType": "NULL", "type": 12, "value": "20" }, { "@class": "io.seata.rm.datasource.sql.struct.Field", "name": "remarks", "keyType": "NULL", "type": 12, "value": "" }, { "@class": "io.seata.rm.datasource.sql.struct.Field", "name": "cid", "keyType": "NULL", "type": 4, "value": 1 }, { "@class": "io.seata.rm.datasource.sql.struct.Field", "name": "cdt", "keyType": "NULL", "type": 93, "value": [ "java.time.LocalDateTime", 1718971249000 ] }, { "@class": "io.seata.rm.datasource.sql.struct.Field", "name": "uid", "keyType": "NULL", "type": 4, "value": 1 }, { "@class": "io.seata.rm.datasource.sql.struct.Field", "name": "udt", "keyType": "NULL", "type": 93, "value": [ "java.time.LocalDateTime", 1718971249000 ] } ] ] } ] ] } } ] ] }里面的packing_unit_id会有两个,在io.seata.rm.datasource.undo.AbstractUndoExecutor下318行报错 20240621205854

funky-eyes commented 1 week ago

请尝试使用2.0版本进行验证 Please try to verify with version 2.0

mrsuibian commented 1 week ago

请尝试使用2.0版本进行验证 Please try to verify with version 2.0

2.0版本因为有另外一个bug,所有没用

funky-eyes commented 1 week ago

https://github.com/apache/incubator-seata/pull/6077
该问题需要等待2.1版本的发布,其已经在2.1版本中进行修复 This issue needs to wait for the release of version 2.1, which has been fixed in version 2.1