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 — Использовать транзакцию для объединения создания версии и обновления документа.
Необходимо гарантировать, что либо обе операции выполняются, либо ни одна из них.
Автоматическая проверка 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 -->
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Severity: major
Commit:
488f11b— alphaЗатронутые места:
service/version.goстроки 121–126В чём проблема
Отсутствие атомарности при сохранении новой версии. Если CreateVersion пройдет успешно, а UpdateLatestVersion упадет, документ останется в состоянии, когда последняя версия не обновлена, но в таблице версий появилась запись. Это приводит к потере данных (новая версия фактически 'исчезла' для системы, хотя место в БД занимает).
Цитата кода
Как исправить
Вариант 1 — Использовать транзакцию для объединения создания версии и обновления документа.
Необходимо гарантировать, что либо обе операции выполняются, либо ни одна из них.
Автоматическая проверка commit-keeper · модель
gemma4:31b·sha=488f11b