В чем разница между пессимистичной и оптимистичной блокировкой

«В чем разница между пессимистичной и оптимистичной блокировкой» — вопрос из категории Базы данных, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Пессимистичная блокировка предполагает, что конфликты вероятны, и заранее блокирует ресурс для других операций (например, через SELECT FOR UPDATE в БД). Оптимистичная — разрешает конфликты только при коммите, проверяя версию данных (через version или timestamp).

Пример оптимистичной блокировки:

type Account struct {
    ID      int
    Balance int
    Version int // для контроля версии
}

func transfer(acc *Account, amount int) error {
    currentVersion := acc.Version
    // Проверяем, что версия не изменилась
    if db.QueryRow("SELECT version FROM accounts WHERE id = $1", acc.ID).Scan(&acc.Version) != currentVersion {
        return errors.New("конфликт версий")
    }
    // Обновляем, если версия совпадает
    _, err := db.Exec("UPDATE accounts SET balance = balance + $1, version = version + 1 WHERE id = $2 AND version = $3", 
        amount, acc.ID, currentVersion)
    return err
}