Severity: major Commit:00b12cd — upd store Затронутые места:
service/version.go строки 63–66
В чём проблема
Отсутствие атомарности при создании новой версии и обновлении ссылки на последнюю версию документа. Операции CreateVersion и UpdateLatestVersion выполняются как два отдельных запроса к БД. Если приложение упадет между этими двумя вызовами, в базе данных появится «сиротская» версия, а документ будет ссылаться на старую версию, что нарушает целостность данных.
Вариант 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 -->
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:
00b12cd— upd storeЗатронутые места:
service/version.goстроки 63–66В чём проблема
Отсутствие атомарности при создании новой версии и обновлении ссылки на последнюю версию документа. Операции
CreateVersionиUpdateLatestVersionвыполняются как два отдельных запроса к БД. Если приложение упадет между этими двумя вызовами, в базе данных появится «сиротская» версия, а документ будет ссылаться на старую версию, что нарушает целостность данных.Цитата кода
Как исправить
Вариант 1 — Использовать транзакцию БД для объединения обеих операций.
Обе операции должны быть обернуты в одну транзакцию, чтобы гарантировать, что либо обе выполнятся, либо ни одна из них.
Автоматическая проверка commit-keeper · модель
gemma4:31b·sha=00b12cd