create table some_table
(
id serial primary key,
some_data text,
version integer not null default 0
);
create or replace function increment_version()
returns trigger
as
$body$
begin
new.version := new.version + 1;
return new;
end;
$body$
language plpgsql;
create trigger version_trigger
before update on some_table
for each row execute procedure increment_version();
create table orders
(
id varchar(255) not null constraint orders_pkey primary key,
name varchar(255) UNIQUE,
order_status varchar(30),
version integer NOT NULL DEFAULT 0,
create_time timestamp,
update_time timestamp
);
-- Always save the version as 0 for inserts
INSERT INTO orders
VALUES (:id, :name, :order_status, :version, :create_time, :update_time);
-- Increase version in each update and check the version
UPDATE TABLE
SET name = :name,
order_status = :order_status,
update_time = :update_time,
version = version + 1
where id = :id
and version = :version;
2条答案
按热度按时间irtuqstp1#
你需要使用一个触发器来实现这一点。没有自动或内置的解决方案
注意,触发器函数可用于包含名为
version
(数字)的列的 * 任何 * 表。7lrncoxx2#
您可以在单个
update
语句中完成此操作。您的insert
语句可以将其保存为0
,而update
语句可以在每次更新该行时将其增加1
。要实现乐观锁定,在update语句运行后,您需要检查任何更新的记录,如果没有,则您知道在更新之前提交了另一个更新请求,您需要重试更新。