Sobes.tech
Назад к вопросам
Junior — Middle
60

Как база данных обработает ситуацию, если два клиента одновременно оформят покупку одного и того же товара, в частности, что случится с полем quantity в таблице products?

Ответ от нейросети

sobes.tech AI

Если два клиента одновременно оформляют покупку одного и того же товара, то поведение поля quantity в таблице products зависит от того, как настроена база данных и как реализована логика транзакций.

В идеале используется транзакция с блокировкой записи (например, SELECT ... FOR UPDATE), чтобы предотвратить гонки данных. При этом:

  1. Первый клиент начинает транзакцию, блокирует запись товара, проверяет и уменьшает quantity.
  2. Второй клиент пытается сделать то же самое, но ждет освобождения блокировки.
  3. Если после первой покупки quantity становится меньше требуемого для второй, операция второго клиента откатывается или возвращает ошибку.

Если блокировок нет, возможна ситуация, когда оба клиента одновременно прочитают одно и то же значение quantity, и оба уменьшат его, что приведет к некорректному результату (например, отрицательному количеству).

Пример на Java с использованием JDBC и транзакций:

connection.setAutoCommit(false);
try {
    PreparedStatement stmt = connection.prepareStatement("SELECT quantity FROM products WHERE id = ? FOR UPDATE");
    stmt.setInt(1, productId);
    ResultSet rs = stmt.executeQuery();
    if (rs.next()) {
        int quantity = rs.getInt("quantity");
        if (quantity >= purchaseAmount) {
            PreparedStatement updateStmt = connection.prepareStatement("UPDATE products SET quantity = quantity - ? WHERE id = ?");
            updateStmt.setInt(1, purchaseAmount);
            updateStmt.setInt(2, productId);
            updateStmt.executeUpdate();
            connection.commit();
        } else {
            connection.rollback();
            throw new RuntimeException("Недостаточно товара на складе");
        }
    }
} catch (SQLException e) {
    connection.rollback();
    throw e;
} finally {
    connection.setAutoCommit(true);
}

Таким образом, правильное управление транзакциями и блокировками гарантирует корректное обновление поля quantity при одновременных покупках.