Ошибка блокировки функции Postgresql - PullRequest
0 голосов
/ 19 декабря 2011

У меня есть триггер, который обновляет таблицу кеша.Функция, выполняемая триггером, выполняет две операции: удаляет старую строку кэша и добавляет новую строку кэша на основе идентификатора с общим числом столбцов таблицы кэша

: id |всего

Из-за высокого уровня активности сервера, я полагаю, что два параллельных вызова функции вызовут следующую ситуацию:

Delete 1 
Delete 2 
Insert 1
Insert 2 ( this will crash because of the primary key )

Есть ли способ предотвратить это?Разве транзакция не должна препятствовать этому (подразумеваемая транзакция в функции postgresql)

1 Ответ

2 голосов
/ 19 декабря 2011

можно использовать консультативные замки. http://www.postgresql.org/docs/9.0/interactive/functions-admin.html

BEGIN
  PERFORM pg_advisory_lock(old.id);
  DELETE FROM cache WHERE some_id = old.id;
  INSERT INTO cache SELECT ...;
  PERFORM pg_advisory_unlock(old.id);
  RETURN old.id;
END;
$$ ...

Pavel

...