在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;
}
主要问题是setAutoCommit方法无法确定db的连接上是否存在分布式事务,但不会提交,而是直接调用commit()方法。 ConnectionProxy隐含JDBC接口,所以我认为我们应该遵循jdbc规范,因为它是一个连接接口,应该与jdbc接口保持一致,因此调用其自己的commit。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。