Блокировка Atomi c optimisti c для таблицы PostgreSQL не завершится ошибкой, если предложение не удовлетворено - PullRequest
1 голос
/ 21 апреля 2020

Допустим, у меня есть определение таблицы ниже:

CREATE TABLE dummy_table (
    id        SERIAL PRIMARY KEY ,
    version   INT NOT NULL,
    data      TEXT NOT NULL);

INSERT INTO dummy_table(version, data)
VALUES (1, 'Stuff');

UPDATE dummy_table
SET version = 2
WHERE id = 1
AND version = 1;

Что в основном дает таблицу в следующем состоянии:

id     version     data
1      2           'Stuff'

Теперь, если несколько оптимистических c блокируют операторы обновления получены ядром базы данных, как убедиться, что они не работают, если версия не является текущей, например:

UPDATE dummy_table
SET version = 1
WHERE id = 1
AND version = 1;

Если условия в пункте не могут быть выполнены, обновление не произойдет , Проблема в том, что при выполнении этого оператора на самом деле нет ошибки в качестве обратной связи.

Я попробовал доступные решения здесь , но я не уверен, что приведенные решения на самом деле являются atomi c:

UPDATE dummy_table
SET version = 1
WHERE id = 1
AND version = 1
RETURNING id;

Не возвращает ничего и не возвращает выбросить любое исключение, если предложение не выполнено.

DO $$
BEGIN
    UPDATE dummy_table 
    SET version = 1 
    WHERE id = 1;
    IF NOT FOUND THEN RAISE EXCEPTION 'Record not found.';
    END IF;
END $$;

Работает, но не уверен, что это на самом деле атомы c.

Есть ли какое-либо решение, которое сделало бы действительным (атомы c ) Сбой обновления Optimisti c, если условие в операторе UPDATE не может быть выполнено?

1 Ответ

1 голос
/ 21 апреля 2020

Оба решения хороши и не подвержены условиям гонки.

Если UPDATE не меняет строк, RETURNING вернет пустой набор результатов, а FOUND будет установлено на FALSE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...