[commit-keeper sha=488f11b] Отсутствие атомарности при сохранении новой версии #3

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

Severity: major
Commit: 488f11b — alpha
Затронутые места:

  • service/version.go строки 121–126

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

Отсутствие атомарности при сохранении новой версии. Если CreateVersion пройдет успешно, а UpdateLatestVersion упадет, документ останется в состоянии, когда последняя версия не обновлена, но в таблице версий появилась запись. Это приводит к потере данных (новая версия фактически 'исчезла' для системы, хотя место в БД занимает).

Цитата кода

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

	// Обновляем ссылку на последнюю версию документа
	if err := s.storage.UpdateLatestVersion(docID, newVer.ID); err != nil {
		return nil, err
	}

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

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

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

err := s.storage.WithTransaction(func(txStore *store.IVersionStorage) error {
	if err := txStore.CreateVersion(&newVer); err != nil {
		return err
	}
	return txStore.UpdateLatestVersion(docID, newVer.ID)
})
if err != nil { return nil, err }

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

**Severity:** major **Commit:** [`488f11b`](https://git.gm6.ru/icewind/seadoc/commit/488f11bd56db4f7e17b4b4bd9bd6e6f4f4a394c5) — alpha **Затронутые места:** - `service/version.go` строки 121–126 ## В чём проблема Отсутствие атомарности при сохранении новой версии. Если CreateVersion пройдет успешно, а UpdateLatestVersion упадет, документ останется в состоянии, когда последняя версия не обновлена, но в таблице версий появилась запись. Это приводит к потере данных (новая версия фактически 'исчезла' для системы, хотя место в БД занимает). ## Цитата кода ``` if err := s.storage.CreateVersion(&newVer); err != nil { return nil, err } // Обновляем ссылку на последнюю версию документа if err := s.storage.UpdateLatestVersion(docID, newVer.ID); err != nil { return nil, err } ``` ## Как исправить ### Вариант 1 — Использовать транзакцию для объединения создания версии и обновления документа. Необходимо гарантировать, что либо обе операции выполняются, либо ни одна из них. ``` err := s.storage.WithTransaction(func(txStore *store.IVersionStorage) error { if err := txStore.CreateVersion(&newVer); err != nil { return err } return txStore.UpdateLatestVersion(docID, newVer.ID) }) if err != nil { return nil, err } ``` --- <sub><sup>Автоматическая проверка commit-keeper · модель `gemma4:31b` · `sha=488f11b`</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#3
No description provided.