Senior
Как работеха оптимистичните блокировки в Postgres?
sobes.tech AI
Отговор от AI
Оптимистичните блокировки в PostgreSQL обикновено се реализират с помощта на механизма за контрол на версиите на редовете (MVCC) и поле, което съхранява версия или времева марка.
Идеята е, че при четене на данни не се поставя блокировка, а при актуализиране се проверява дали данните не са се променили от момента на четене. Ако са се променили, операцията се отменя или повтаря.
В Go това може да се реализира по следния начин:
- При извличане на данните се чете полето за версия (например,
xminили потребителско полеversion). - При актуализиране в SQL се пише условието
WHERE id = ? AND version = ?. - Ако актуализацията засегне 0 реда, означава, че данните са се променили и трябва да се обработи конфликт.
Пример SQL:
UPDATE table SET data = $1, version = version + 1 WHERE id = $2 AND version = $3;
В Go код това изглежда приблизително така:
result, err := db.ExecContext(ctx, "UPDATE table SET data = $1, version = version + 1 WHERE id = $2 AND version = $3", newData, id, oldVersion)
rowsAffected, _ := result.RowsAffected()
if rowsAffected == 0 {
// Обработка на конфликт — повторете или върнете грешка
}
По този начин, оптимистичната блокировка позволява да се избегнат блокировки при четене и да се минимизират конфликтите при конкурентни актуализации.