当前使用版本(必填,否则不予处理)

  • mybatis-plus-core 3.5.3.1
  • etcd 3.5.4 版本
  • JETCD 0.7.0-0.7.6
  • spring-boot-starter 2.7.12
  • JDK 1.8 版本

该问题是如何引起的?(确定最新版也有问题再提!!!)

jetcd版本为0.7.0-0.7.6时,mybatis将某些内容保存或更新到数据库 时出错。线程将停留在数据保存阶段,数据库将不会收到响应。以上所有操作均不涉及 ETCD 操作。

以下两种场景的 jetcd 版本相同,即 0.7.0,但结果不同。

以下代码已成功执行

    @Override
 // @Transactional(rollbackFor = Exception.class)
    public boolean saveAndUpdate(Site site) {
        Site siteById = getById(site.getId());
        if (siteById.getId().isEmpty()) {
            return save(site);
        } else {
            updateById(site);
        }
        return true;
    }

以下代码执行错误

    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean saveAndUpdate(Site site) {
        Site siteById = getById(site.getId());
        if (siteById.getId().isEmpty()) {
            return save(site);
        } else {
            updateById(site);
        }
        return true;
    }

重现步骤(如果有就写完整)

当整个代码中只有 jetcd 的版本更改时。当 jetcd-0.5.8 时,执行以下两个代码块没有问题。但是,当 jetcd 0.7.0 存在时,@ 事务代码块无法执行。怀疑 jetcd 0.7.0 及以上版本的事务与数据库事务之间存在冲突,但是已在jetcd的社区发布该问题,那边团队已说明JETCD 不使用 和 database。因为我对mybatis-plus的具体实现不是很熟悉,所以正在寻求你们专业团队的帮助。 MyBatis-Plus MyBatyis-plus的事务处理存在问题,当jetcd版本升级到0.7.0以上时saveOrUpdate会被卡死,但jetcd已咨询不涉及database。 jetcd的issues链接:https://github.com/etcd-io/jetcd/issues/1275

以下代码已成功执行

    @Override
 // @Transactional(rollbackFor = Exception.class)
    public boolean saveAndUpdate(Site site) {
        Site siteById = getById(site.getId());
        if (siteById.getId().isEmpty()) {
            return save(site);
        } else {
            updateById(site);
        }
        return true;
    }

以下代码执行错误

    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean saveAndUpdate(Site site) {
        Site siteById = getById(site.getId());
        if (siteById.getId().isEmpty()) {
            return save(site);
        } else {
            updateById(site);
        }
        return true;
    }

报错信息

无具体报错信息,程序直接卡死在saveOrUpdate()函数的事务加载中。debug形式发现不会跳转到com\baomidou\mybatis-plus-extension\3.5.3.1\mybatis-plus-extension-3.5.3.1.jar!\com\baomidou\mybatisplus\extension\service\impl\ServiceImpl.class函数中的public boolean saveOrUpdate(T entity) {方法中,疑似卡死,或者事务被锁导致。

Comment From: nieqiurong

他不支持那你就只能自己定义service了.

Comment From: liangyuanpeng

按照描述的现象,应该是哪个地方的依赖冲突了,但具体是哪里冲突得在 jdbc/springboot/mybatis-plus 这边看,因为代码层面上和 jetcd 没有关系

Comment From: nieqiurong

看了下issues说的,这和mybatis-plus也无关,看是spring事务和你那jetcd哪里冲突了.