[commit-keeper sha=00b12cd] Отсутствие атомарности при сохранении версии #6

Open
opened 2026-04-27 09:18:07 +00:00 by commit-keeper · 0 comments

Severity: major
Commit: 00b12cd — upd store
Затронутые места:

  • service/version.go строки 63–66

В чём проблема

Отсутствие атомарности при создании новой версии и обновлении ссылки на последнюю версию документа. Операции CreateVersion и UpdateLatestVersion выполняются как два отдельных запроса к БД. Если приложение упадет между этими двумя вызовами, в базе данных появится «сиротская» версия, а документ будет ссылаться на старую версию, что нарушает целостность данных.

Цитата кода

if err := s.storage.CreateVersion(&newVer); err != nil {
		return nil, err
	}
	_ = s.storage.UpdateLatestVersion(docID, newVer.ID)
	return &newVer, nil

Как исправить

Вариант 1 — Использовать транзакцию БД для объединения обеих операций.

Обе операции должны быть обернуты в одну транзакцию, чтобы гарантировать, что либо обе выполнятся, либо ни одна из них.

// В интерфейсе IVersionStorage добавить метод для атомарного сохранения
func (s *VersionService) SaveNewVersion(...) {
    // ...
    err := s.storage.SaveVersionAndUpdateLatest(docID, &newVer)
    if err != nil {
        return nil, err
    }
    return &newVer, nil
}

Автоматическая проверка commit-keeper · модель gemma4:31b · sha=00b12cd

**Severity:** major **Commit:** [`00b12cd`](https://git.gm6.ru/icewind/seadoc/commit/00b12cdf7dbee7b9d54a1075acfdc0666ff6aa30) — upd store **Затронутые места:** - `service/version.go` строки 63–66 ## В чём проблема Отсутствие атомарности при создании новой версии и обновлении ссылки на последнюю версию документа. Операции `CreateVersion` и `UpdateLatestVersion` выполняются как два отдельных запроса к БД. Если приложение упадет между этими двумя вызовами, в базе данных появится «сиротская» версия, а документ будет ссылаться на старую версию, что нарушает целостность данных. ## Цитата кода ``` if err := s.storage.CreateVersion(&newVer); err != nil { return nil, err } _ = s.storage.UpdateLatestVersion(docID, newVer.ID) return &newVer, nil ``` ## Как исправить ### Вариант 1 — Использовать транзакцию БД для объединения обеих операций. Обе операции должны быть обернуты в одну транзакцию, чтобы гарантировать, что либо обе выполнятся, либо ни одна из них. ``` // В интерфейсе IVersionStorage добавить метод для атомарного сохранения func (s *VersionService) SaveNewVersion(...) { // ... err := s.storage.SaveVersionAndUpdateLatest(docID, &newVer) if err != nil { return nil, err } return &newVer, nil } ``` --- <sub><sup>Автоматическая проверка commit-keeper · модель `gemma4:31b` · `sha=00b12cd`</sup></sub> <!-- commit-keeper -->
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: icewind/seadoc#6
No description provided.