From 6adeadeed4e5942407055bc607932bedf62bafcc Mon Sep 17 00:00:00 2001 From: landaiqing Date: Tue, 19 Aug 2025 00:24:51 +0800 Subject: [PATCH] :bug: Fixed document deadlock issue --- frontend/src/stores/documentStore.ts | 2 -- internal/services/document_service.go | 27 +++++++++++++++------------ 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/frontend/src/stores/documentStore.ts b/frontend/src/stores/documentStore.ts index 3c23e6a..44c8e48 100644 --- a/frontend/src/stores/documentStore.ts +++ b/frontend/src/stores/documentStore.ts @@ -160,12 +160,10 @@ export const useDocumentStore = defineStore('document', () => { try { // 检查是否是默认文档(使用ID判断) if (docId === SCRATCH_DOCUMENT_ID) { - console.log('Cannot delete default document (ID=1)'); return false; } await DocumentService.DeleteDocument(docId); - console.log('Backend delete successful for doc:', docId); // 更新本地状态 delete documents.value[docId]; diff --git a/internal/services/document_service.go b/internal/services/document_service.go index eda0350..d718733 100644 --- a/internal/services/document_service.go +++ b/internal/services/document_service.go @@ -216,14 +216,11 @@ func (ds *DocumentService) CreateDocument(title string) (*models.Document, error // LockDocument 锁定文档,防止删除 func (ds *DocumentService) LockDocument(id int64) error { - ds.mu.Lock() - defer ds.mu.Unlock() - if ds.databaseService == nil || ds.databaseService.db == nil { return errors.New("database service not available") } - // 检查文档是否存在且未删除 + // 先检查文档是否存在且未删除(不加锁避免死锁) doc, err := ds.GetDocumentByID(id) if err != nil { return fmt.Errorf("failed to get document: %w", err) @@ -240,6 +237,10 @@ func (ds *DocumentService) LockDocument(id int64) error { return nil } + // 现在加锁执行锁定操作 + ds.mu.Lock() + defer ds.mu.Unlock() + _, err = ds.databaseService.db.Exec(sqlSetDocumentLocked, time.Now().Format("2006-01-02 15:04:05"), id) if err != nil { return fmt.Errorf("failed to lock document: %w", err) @@ -249,14 +250,11 @@ func (ds *DocumentService) LockDocument(id int64) error { // UnlockDocument 解锁文档 func (ds *DocumentService) UnlockDocument(id int64) error { - ds.mu.Lock() - defer ds.mu.Unlock() - if ds.databaseService == nil || ds.databaseService.db == nil { return errors.New("database service not available") } - // 检查文档是否存在 + // 先检查文档是否存在(不加锁避免死锁) doc, err := ds.GetDocumentByID(id) if err != nil { return fmt.Errorf("failed to get document: %w", err) @@ -270,6 +268,10 @@ func (ds *DocumentService) UnlockDocument(id int64) error { return nil } + // 现在加锁执行解锁操作 + ds.mu.Lock() + defer ds.mu.Unlock() + _, err = ds.databaseService.db.Exec(sqlSetDocumentUnlocked, time.Now().Format("2006-01-02 15:04:05"), id) if err != nil { return fmt.Errorf("failed to unlock document: %w", err) @@ -311,9 +313,6 @@ func (ds *DocumentService) UpdateDocumentTitle(id int64, title string) error { // DeleteDocument marks a document as deleted (default document with ID=1 cannot be deleted) func (ds *DocumentService) DeleteDocument(id int64) error { - ds.mu.Lock() - defer ds.mu.Unlock() - if ds.databaseService == nil || ds.databaseService.db == nil { ds.logger.Error("database service not available") return errors.New("database service not available") @@ -324,7 +323,7 @@ func (ds *DocumentService) DeleteDocument(id int64) error { return fmt.Errorf("cannot delete the default document") } - // 检查文档是否锁定 + // 先检查文档是否存在和锁定状态(不加锁避免死锁) doc, err := ds.GetDocumentByID(id) if err != nil { return fmt.Errorf("failed to get document: %w", err) @@ -336,6 +335,10 @@ func (ds *DocumentService) DeleteDocument(id int64) error { return fmt.Errorf("cannot delete locked document: %d", id) } + // 现在加锁执行删除操作 + ds.mu.Lock() + defer ds.mu.Unlock() + _, err = ds.databaseService.db.Exec(sqlMarkDocumentAsDeleted, time.Now().Format("2006-01-02 15:04:05"), id) if err != nil { return fmt.Errorf("failed to mark document as deleted: %w", err)