开发者社区 问答 正文

感觉 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 808 分享 版权
来自: 阿里开源
1 条回答
写回答
取消 提交回答
  • 主要问题是setAutoCommit方法无法确定db的连接上是否存在分布式事务,但不会提交,而是直接调用commit()方法。 ConnectionProxy隐含JDBC接口,所以我认为我们应该遵循jdbc规范,因为它是一个连接接口,应该与jdbc接口保持一致,因此调用其自己的commit。

    2021-02-02 10:44:04
    赞同 展开评论
问答标签:
问答地址: