Sobes.tech
Back to questions
Senior
4

Как полностью выглядел путь оптимистичной блокировки от получения сообщения из Kafka до обновления в БД?

Companies where asked
КасперскийКасперский

Answer from AI

sobes.tech AI

Оптимистичная блокировка при обработке сообщений из Kafka и обновлении базы данных обычно выглядит так:

  1. Получаем сообщение из Kafka, содержащее данные для обновления.
  2. Извлекаем из сообщения ключ сущности и версию (или timestamp) текущей записи.
  3. Выполняем запрос к базе данных с условием, что версия записи совпадает с той, что была в сообщении (т.е. никто не изменил запись с момента получения сообщения).
  4. Если условие выполняется, обновляем запись, увеличивая версию.
  5. Если условие не выполняется (конфликт версий), откатываем операцию или повторяем попытку.

Пример на Go с использованием SQL:

// msg содержит ID и версию записи
func processMessage(msg Message) error {
    tx, err := db.Begin()
    if err != nil {
        return err
    }
    defer tx.Rollback()

    res, err := tx.Exec(`UPDATE items SET data = ?, version = version + 1 WHERE id = ? AND version = ?`, msg.Data, msg.ID, msg.Version)
    if err != nil {
        return err
    }

    rowsAffected, err := res.RowsAffected()
    if err != nil {
        return err
    }

    if rowsAffected == 0 {
        // Конфликт версий — кто-то обновил запись раньше
        return fmt.Errorf("optimistic lock failed")
    }

    return tx.Commit()
}

Таким образом, мы гарантируем, что обновление произойдет только если данные не изменились с момента чтения, что предотвращает потерю данных при конкурентных изменениях.