当前使用版本(必填,否则不予处理)
- 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的具体实现不是很熟悉,所以正在寻求你们专业团队的帮助。
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哪里冲突了.