mirror of
https://github.com/vran-dev/databasir.git
synced 2025-08-09 12:06:31 +08:00
fix: duplicate project version when concurrency (#108)
This commit is contained in:
@@ -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;
|
||||
|
||||
|
@@ -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);
|
||||
|
@@ -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();
|
||||
|
Reference in New Issue
Block a user