fix: duplicate project version when concurrency (#108)

This commit is contained in:
vran
2022-04-19 22:32:22 +08:00
committed by GitHub
parent 821a3673d3
commit ad4b1d9fe0
8 changed files with 29 additions and 15 deletions

View File

@@ -45,7 +45,7 @@ public enum DomainErrors implements DatabasirErrors {
INVALID_MOCK_DATA_SCRIPT("A_10029", "不合法的表达式"),
CANNOT_DELETE_SELF("A_10030", "无法对自己执行删除账号操作"),
DRIVER_CLASS_NOT_FOUND("A_10031", "获取驱动类名失败"),
;
DATABASE_DOCUMENT_DUPLICATE_KEY("A_10032", "文档版本重复");
private final String errCode;

View File

@@ -1,5 +1,6 @@
package com.databasir.core.domain.document.service;
import com.databasir.common.DatabasirException;
import com.databasir.core.Databasir;
import com.databasir.core.DatabasirConfig;
import com.databasir.core.diff.Diffs;
@@ -21,6 +22,7 @@ import com.databasir.dao.value.DocumentDiscussionCountPojo;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.jooq.tools.StringUtils;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
@@ -146,7 +148,13 @@ public class DocumentService {
Integer projectId) {
var pojo = documentPojoConverter.toDatabasePojo(projectId, meta, version);
final Integer docId = databaseDocumentDao.insertAndReturnId(pojo);
final Integer docId;
try {
docId = databaseDocumentDao.insertAndReturnId(pojo);
} catch (DuplicateKeyException e) {
log.warn("ignore insert database document projectId={} version={}", projectId, version);
throw new DatabasirException(DomainErrors.DATABASE_DOCUMENT_DUPLICATE_KEY);
}
meta.getTables().forEach(table -> {
TableDocumentPojo tableMeta =
documentPojoConverter.toTablePojo(docId, table);

View File

@@ -188,12 +188,12 @@ public class ProjectService {
@Transactional
public Optional<Integer> createSyncTask(Integer projectId, Integer userId, boolean ignoreIfExists) {
if (!projectDao.existsById(projectId)) {
log.info("create sync task failed, because project not exists, projectId={}", projectId);
return Optional.empty();
log.warn("create sync task failed, because project not exists, projectId={}", projectId);
throw DomainErrors.PROJECT_NOT_FOUND.exception();
}
var validTaskStatus = List.of(ProjectSyncTaskStatus.NEW, ProjectSyncTaskStatus.RUNNING);
if (ignoreIfExists && projectSyncTaskDao.existsByProjectId(projectId, validTaskStatus)) {
log.info("create sync task failed, it's already exists, projectId={}", projectId);
log.warn("create sync task failed, it's already exists, projectId={}", projectId);
return Optional.empty();
}
ProjectSyncTaskPojo projectSyncTask = new ProjectSyncTaskPojo();