开发者社区> 问答> 正文

感觉 seata 即使发生错误,分支状态也可能是PhaseOne_Done

在AbstractDMLBaseExecutor.executeAutoCommitTrue中,connectionProxy.setAutoCommit(true)在finally块中执行,尽管发生异常或回滚,这可能会导致分支状态设置成功完成的事件,因为setAutoCommit(true)也调用方法commit,并且提交可能成功。

protected T executeAutoCommitTrue(Object[] args) throws Throwable {
        T result = null;
        AbstractConnectionProxy connectionProxy = statementProxy.getConnectionProxy();
        LockRetryController lockRetryController = new LockRetryController();
        try {
            connectionProxy.setAutoCommit(false);
            while (true) {
                try {
                    result = executeAutoCommitFalse(args);
                    connectionProxy.commit();
                    break;
                } catch (LockConflictException lockConflict) {
                    connectionProxy.getTargetConnection().rollback();
                    lockRetryController.sleep(lockConflict);
                }
            }

        } catch (Exception e) {
            // when exception occur in finally,this exception will lost, so just print it here
            LOGGER.error("exception occur", e);
            throw e;
        } finally {
            connectionProxy.setAutoCommit(true);
        }
        return result;
    }

展开
收起
一人吃饱,全家不饿 2021-02-02 10:43:57 777 0
来自:阿里开源
1 条回答
写回答
取消 提交回答
  • 主要问题是setAutoCommit方法无法确定db的连接上是否存在分布式事务,但不会提交,而是直接调用commit()方法。 ConnectionProxy隐含JDBC接口,所以我认为我们应该遵循jdbc规范,因为它是一个连接接口,应该与jdbc接口保持一致,因此调用其自己的commit。

    2021-02-02 10:44:04
    赞同 展开评论 打赏
问答标签:
问答地址:
来源圈子
更多
收录在圈子:
+ 订阅
阿里巴巴相信开源的世界里人人贡献代码,人人获得收益,共同创造一个互帮互利的社区,促进技术进步和发展。
问答排行榜
最热
最新

相关电子书

更多
《Seata 1.3 新特性以及如何参与社区》 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载