🐛 Fixed document deadlock issue
This commit is contained in:
@@ -160,12 +160,10 @@ export const useDocumentStore = defineStore('document', () => {
|
|||||||
try {
|
try {
|
||||||
// 检查是否是默认文档(使用ID判断)
|
// 检查是否是默认文档(使用ID判断)
|
||||||
if (docId === SCRATCH_DOCUMENT_ID) {
|
if (docId === SCRATCH_DOCUMENT_ID) {
|
||||||
console.log('Cannot delete default document (ID=1)');
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
await DocumentService.DeleteDocument(docId);
|
await DocumentService.DeleteDocument(docId);
|
||||||
console.log('Backend delete successful for doc:', docId);
|
|
||||||
|
|
||||||
// 更新本地状态
|
// 更新本地状态
|
||||||
delete documents.value[docId];
|
delete documents.value[docId];
|
||||||
|
|||||||
@@ -216,14 +216,11 @@ func (ds *DocumentService) CreateDocument(title string) (*models.Document, error
|
|||||||
|
|
||||||
// LockDocument 锁定文档,防止删除
|
// LockDocument 锁定文档,防止删除
|
||||||
func (ds *DocumentService) LockDocument(id int64) error {
|
func (ds *DocumentService) LockDocument(id int64) error {
|
||||||
ds.mu.Lock()
|
|
||||||
defer ds.mu.Unlock()
|
|
||||||
|
|
||||||
if ds.databaseService == nil || ds.databaseService.db == nil {
|
if ds.databaseService == nil || ds.databaseService.db == nil {
|
||||||
return errors.New("database service not available")
|
return errors.New("database service not available")
|
||||||
}
|
}
|
||||||
|
|
||||||
// 检查文档是否存在且未删除
|
// 先检查文档是否存在且未删除(不加锁避免死锁)
|
||||||
doc, err := ds.GetDocumentByID(id)
|
doc, err := ds.GetDocumentByID(id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to get document: %w", err)
|
return fmt.Errorf("failed to get document: %w", err)
|
||||||
@@ -240,6 +237,10 @@ func (ds *DocumentService) LockDocument(id int64) error {
|
|||||||
return nil
|
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)
|
_, err = ds.databaseService.db.Exec(sqlSetDocumentLocked, time.Now().Format("2006-01-02 15:04:05"), id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to lock document: %w", err)
|
return fmt.Errorf("failed to lock document: %w", err)
|
||||||
@@ -249,14 +250,11 @@ func (ds *DocumentService) LockDocument(id int64) error {
|
|||||||
|
|
||||||
// UnlockDocument 解锁文档
|
// UnlockDocument 解锁文档
|
||||||
func (ds *DocumentService) UnlockDocument(id int64) error {
|
func (ds *DocumentService) UnlockDocument(id int64) error {
|
||||||
ds.mu.Lock()
|
|
||||||
defer ds.mu.Unlock()
|
|
||||||
|
|
||||||
if ds.databaseService == nil || ds.databaseService.db == nil {
|
if ds.databaseService == nil || ds.databaseService.db == nil {
|
||||||
return errors.New("database service not available")
|
return errors.New("database service not available")
|
||||||
}
|
}
|
||||||
|
|
||||||
// 检查文档是否存在
|
// 先检查文档是否存在(不加锁避免死锁)
|
||||||
doc, err := ds.GetDocumentByID(id)
|
doc, err := ds.GetDocumentByID(id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to get document: %w", err)
|
return fmt.Errorf("failed to get document: %w", err)
|
||||||
@@ -270,6 +268,10 @@ func (ds *DocumentService) UnlockDocument(id int64) error {
|
|||||||
return nil
|
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)
|
_, err = ds.databaseService.db.Exec(sqlSetDocumentUnlocked, time.Now().Format("2006-01-02 15:04:05"), id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to unlock document: %w", err)
|
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)
|
// DeleteDocument marks a document as deleted (default document with ID=1 cannot be deleted)
|
||||||
func (ds *DocumentService) DeleteDocument(id int64) error {
|
func (ds *DocumentService) DeleteDocument(id int64) error {
|
||||||
ds.mu.Lock()
|
|
||||||
defer ds.mu.Unlock()
|
|
||||||
|
|
||||||
if ds.databaseService == nil || ds.databaseService.db == nil {
|
if ds.databaseService == nil || ds.databaseService.db == nil {
|
||||||
ds.logger.Error("database service not available")
|
ds.logger.Error("database service not available")
|
||||||
return errors.New("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")
|
return fmt.Errorf("cannot delete the default document")
|
||||||
}
|
}
|
||||||
|
|
||||||
// 检查文档是否锁定
|
// 先检查文档是否存在和锁定状态(不加锁避免死锁)
|
||||||
doc, err := ds.GetDocumentByID(id)
|
doc, err := ds.GetDocumentByID(id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to get document: %w", err)
|
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)
|
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)
|
_, err = ds.databaseService.db.Exec(sqlMarkDocumentAsDeleted, time.Now().Format("2006-01-02 15:04:05"), id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to mark document as deleted: %w", err)
|
return fmt.Errorf("failed to mark document as deleted: %w", err)
|
||||||
|
|||||||
Reference in New Issue
Block a user