Ответ
Пессимистичная блокировка предполагает, что конфликты вероятны, и заранее блокирует ресурс для других операций (например, через 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
}