diff --git a/dao/src/main/java/org/thingsboard/server/dao/relation/BaseRelationService.java b/dao/src/main/java/org/thingsboard/server/dao/relation/BaseRelationService.java index 15ddb9a390..b577022d57 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/relation/BaseRelationService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/relation/BaseRelationService.java @@ -27,6 +27,7 @@ import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.cache.annotation.Caching; +import org.springframework.dao.ConcurrencyFailureException; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import org.thingsboard.server.common.data.id.EntityId; @@ -201,6 +202,7 @@ public class BaseRelationService implements RelationService { } relationDao.deleteOutboundRelations(tenantId, entityId); + } @Override @@ -262,10 +264,13 @@ public class BaseRelationService implements RelationService { boolean delete(TenantId tenantId, Cache cache, EntityRelation relation, boolean deleteFromDb) { cacheEviction(relation, cache); if (deleteFromDb) { - return relationDao.deleteRelation(tenantId, relation); - } else { - return false; + try { + return relationDao.deleteRelation(tenantId, relation); + } catch (ConcurrencyFailureException e) { + log.debug("Concurrency exception while deleting relations [{}]", relation, e); + } } + return false; } private void cacheEviction(EntityRelation relation, Cache cache) { diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/relation/JpaRelationDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/relation/JpaRelationDao.java index 5e10cabda2..91cc1a0c9f 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/relation/JpaRelationDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/relation/JpaRelationDao.java @@ -18,6 +18,7 @@ package org.thingsboard.server.dao.sql.relation; import com.google.common.util.concurrent.ListenableFuture; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.ConcurrencyFailureException; import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Component; import org.thingsboard.server.common.data.EntityType; @@ -163,11 +164,16 @@ public class JpaRelationDao extends JpaAbstractDaoListeningExecutorService imple @Override public boolean deleteOutboundRelations(TenantId tenantId, EntityId entity) { - boolean relationExistsBeforeDelete = relationRepository - .findAllByFromIdAndFromType(entity.getId(), entity.getEntityType().name()) - .size() > 0; - if (relationExistsBeforeDelete) { - relationRepository.deleteByFromIdAndFromType(entity.getId(), entity.getEntityType().name()); + boolean relationExistsBeforeDelete = false; + try { + relationExistsBeforeDelete = relationRepository + .findAllByFromIdAndFromType(entity.getId(), entity.getEntityType().name()) + .size() > 0; + if (relationExistsBeforeDelete) { + relationRepository.deleteByFromIdAndFromType(entity.getId(), entity.getEntityType().name()); + } + } catch (ConcurrencyFailureException e) { + log.debug("Concurrency exception while deleting relations [{}]", entity, e); } return relationExistsBeforeDelete; }