Sobes.tech
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 {
    // Обработка на конфликт — повторете или върнете грешка
}

По този начин, оптимистичната блокировка позволява да се избегнат блокировки при четене и да се минимизират конфликтите при конкурентни актуализации.