Обернуть покупку в транзакцию (race condition) #44

Closed
opened 2026-06-17 19:39:15 +00:00 by NW · 1 comment
Owner

Проблема

purchaseService.js:45-108 — баланс проверяется и списывается без BEGIN TRANSACTION. При параллельных покупках возможен double-spend.

Решение

  • Обернуть createPurchase в BEGIN IMMEDIATE TRANSACTION / COMMIT / ROLLBACK
  • Проверка остатка на складе в той же транзакции
  • Использовать UPDATE ... WHERE quantity_in_stock >= ? для атомарного списания
  • Добавить тест на параллельные покупки

Файлы

  • src/services/purchaseService.js
  • src/services/productService.js

Приоритет: КРИТИЧЕСКИЙ

## Проблема `purchaseService.js:45-108` — баланс проверяется и списывается без `BEGIN TRANSACTION`. При параллельных покупках возможен double-spend. ## Решение - [ ] Обернуть createPurchase в `BEGIN IMMEDIATE TRANSACTION` / `COMMIT` / `ROLLBACK` - [ ] Проверка остатка на складе в той же транзакции - [ ] Использовать `UPDATE ... WHERE quantity_in_stock >= ?` для атомарного списания - [ ] Добавить тест на параллельные покупки ## Файлы - `src/services/purchaseService.js` - `src/services/productService.js` ## Приоритет: КРИТИЧЕСКИЙ
NW added this to the Phase 1: Security & Secrets Management milestone 2026-06-17 19:39:15 +00:00
NW added the priority::criticaltype::bugphase::1 labels 2026-06-17 19:39:15 +00:00
NW closed this issue 2026-06-17 20:29:53 +00:00
Author
Owner

Реализовано

  • Обернуть createPurchase в BEGIN IMMEDIATE TRANSACTION / COMMIT / ROLLBACK
  • Проверка остатка на складе в той же транзакции
  • Использовать UPDATE ... WHERE quantity_in_stock >= ? для атомарного списания
  • Атомарные проверки баланса (bonus_balance >= ?, total_balance >= ?)

Файлы: src/services/purchaseService.js

## ✅ Реализовано - [x] Обернуть createPurchase в BEGIN IMMEDIATE TRANSACTION / COMMIT / ROLLBACK - [x] Проверка остатка на складе в той же транзакции - [x] Использовать UPDATE ... WHERE quantity_in_stock >= ? для атомарного списания - [x] Атомарные проверки баланса (bonus_balance >= ?, total_balance >= ?) **Файлы**: `src/services/purchaseService.js`
Sign in to join this conversation.