我做简单的日程安排服务。PostgreSQL:如何在首次交易未完成时使其他交易可读取更新
一个有工作表
CREATE TABLE system_jobs (
id bigserial,
job_time timestamp without time zone,
job_function text,
run_on text,
CONSTRAINT system_jobs_pri PRIMARY KEY (id)
)
多个Java后台程序选择所有行job_time < now()
和执行job_function
60之前(通过他们的id
作为参数)
工作职务样品
CREATE OR REPLACE FUNCTION public.sjob_test(in_id bigint)
RETURNS text AS
$BODY$DECLARE
utc timestamp without time zone;
BEGIN
utc := timezone('UTC', now());
-- This changes not avail from other transactions
UPDATE system_jobs SET run_on='hello' WHERE id = in_id;
PERFORM pl_delay(60); -- Delay 1 minute
UPDATE system_jobs SET job_time = now() + interval '10 seconds', run_on = '' WHERE id = in_id;
RETURN 'done';
END;$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
内部功能秒延迟我更新run_on
字段,并在延迟后重置。
我希望run_on
包含'你好',而延迟(60秒),并可用于从其他交易中读取,但事实并非如此。
我的任务 - 防止同时执行不同的JAVA守护进程相同的job_function
。我想在执行前检查run_on
。
我读了很多关于交易级别的文档和博客,但我不明白我怎么能在实践中使用它。
如何配置我的函数或表或外部进程以允许其他事务看到此更改?
不可能。 Postgres永远不会允许脏读(未提交的更改) –