apache / apache/incubator-seata-samples
脏数据处理一直报异常
- Dominant language
- Java
- Stars
- 2.4k
- Forks
- 2k
- PR merge metrics
- No merged PRs in 30d
Description
`io.seata.core.exception.BranchTransactionException: Branch session rollback failed and try again later xid = 192.168.7.83:8091:2038071926 branchId = 2038071938 Has dirty records when undo.
at io.seata.rm.datasource.undo.AbstractUndoLogManager.undo(AbstractUndoLogManager.java:335) ~[seata-all-1.1.0.jar:1.1.0]
at io.seata.rm.datasource.DataSourceManager.branchRollback(DataSourceManager.java:181) ~[seata-all-1.1.0.jar:1.1.0]
at io.seata.rm.AbstractRMHandler.doBranchRollback(AbstractRMHandler.java:124) [seata-all-1.1.0.jar:1.1.0]
at io.seata.rm.AbstractRMHandler$2.execute(AbstractRMHandler.java:68) [seata-all-1.1.0.jar:1.1.0]
at io.seata.rm.AbstractRMHandler$2.execute(AbstractRMHandler.java:64) [seata-all-1.1.0.jar:1.1.0]
at io.seata.core.exception.AbstractExceptionHandler.exceptionHandleTemplate(AbstractExceptionHandler.java:117) [seata-all-1.1.0.jar:1.1.0]
at io.seata.rm.AbstractRMHandler.handle(AbstractRMHandler.java:64) [seata-all-1.1.0.jar:1.1.0]
at io.seata.rm.DefaultRMHandler.handle(DefaultRMHandler.java:63) [seata-all-1.1.0.jar:1.1.0]
at io.seata.core.protocol.transaction.BranchRollbackRequest.handle(BranchRollbackRequest.java:35) [seata-all-1.1.0.jar:1.1.0]
at io.seata.rm.AbstractRMHandler.onRequest(AbstractRMHandler.java:149) [seata-all-1.1.0.jar:1.1.0]
at io.seata.core.rpc.netty.RmMessageListener.handleBranchRollback(RmMessageListener.java:93) [seata-all-1.1.0.jar:1.1.0]
at io.seata.core.rpc.netty.RmMessageListener.onMessage(RmMessageListener.java:84) [seata-all-1.1.0.jar:1.1.0]
at io.seata.core.rpc.netty.AbstractRpcRemotingClient$ClientHandler.dispatch(AbstractRpcRemotingClient.java:284) [seata-all-1.1.0.jar:1.1.0]
at io.seata.core.rpc.netty.AbstractRpcRemoting$AbstractHandler$1.run(AbstractRpcRemoting.java:452) [seata-all-1.1.0.jar:1.1.0]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_161]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_161]
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) [netty-common-4.1.29.Final.jar:4.1.29.Final]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_161]
Caused by: java.sql.SQLException: Has dirty records when undo.
at io.seata.rm.datasource.undo.AbstractUndoExecutor.dataValidationAndGoOn(AbstractUndoExecutor.java:247) ~[seata-all-1.1.0.jar:1.1.0]
at io.seata.rm.datasource.undo.AbstractUndoExecutor.executeOn(AbstractUndoExecutor.java:109) ~[seata-all-1.1.0.jar:1.1.0]
at io.seata.rm.datasource.undo.AbstractUndoLogManager.undo(AbstractUndoLogManager.java:287) ~[seata-all-1.1.0.jar:1.1.0]
... 17 common frames omitted`
在spring-cloud-eureka中,当服务调用顺序是order ->stotage -> account时,account服务模拟抛出异常,当请求调用到第三个服务未完成时,手动修改了第二个stotage服务的数据,之后就一直报这样的异常,这该怎么处理呢?现实业务中如果遇到这种情形,这条数据是不是修改不了了?
Contributor guide
Research direction
Start with the reported stack path in AbstractUndoExecutor.java, especially dataValidationAndGoOn, then trace the call into AbstractUndoLogManager.java. Reproduce the spring-cloud-eureka order→storage→account scenario with a manual data change during rollback. Done means documenting the expected handling and whether the affected record can be recovered, with evidence from the reproduced behavior.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- java, spring
- Domain
- backend, distributed-systems
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Needs clarification
- Newbie friendliness
- 25/100