Допустим, у меня есть определение таблицы ниже:
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
не может быть выполнено?