Что такое оптимистическая блокировка?
Ответ от нейросети
sobes.tech AI
Оптимистическая блокировка — это стратегия управления конкурентным доступом к данным, при которой предполагается, что конфликты при одновременном изменении данных случаются редко.
Вместо того, чтобы блокировать ресурс на время операции (как в пессимистической блокировке), оптимистическая блокировка позволяет нескольким транзакциям работать параллельно, а проверку конфликтов выполняет при сохранении изменений.
Основной механизм — хранение версии или контрольной суммы данных. При обновлении проверяется, что версия данных не изменилась с момента чтения. Если версия изменилась — значит, другой процесс изменил данные, и текущая операция откатывается или повторяется.
Пример использования:
- В базе данных в таблице есть поле version (число).
- Клиент читает запись с version=1.
- Клиент пытается обновить запись, указывая в условии WHERE version=1.
- Если в базе версия уже стала 2, обновление не выполнится, и клиент узнает о конфликте.
Оптимистическая блокировка подходит для систем с низкой конкуренцией и высокой нагрузкой, где блокировки могут сильно снижать производительность.
Пример на Go (упрощённо):
type Record struct {
ID int
Data string
Version int
}
func UpdateRecord(r *Record, newData string) error {
// Читаем текущую версию из БД
currentVersion := getVersionFromDB(r.ID)
if currentVersion != r.Version {
return errors.New("конфликт обновления")
}
// Обновляем данные и увеличиваем версию
r.Data = newData
r.Version++
// Пытаемся сохранить с условием версии
err := updateInDB(r)
if err != nil {
return err
}
return nil
}
Таким образом, оптимистическая блокировка помогает избежать блокировок и обеспечивает целостность данных при конкурентных изменениях.