Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java PostgreSQL:如何在第一个事务未完成时使更新从其他事务中可读_Java_Sql_Postgresql - Fatal编程技术网

Java PostgreSQL:如何在第一个事务未完成时使更新从其他事务中可读

Java PostgreSQL:如何在第一个事务未完成时使更新从其他事务中可读,java,sql,postgresql,Java,Sql,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

我做简单的日程安排服务

一张有工作的桌子

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 job_函数示例

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;
在60秒延迟之前,内部功能更新run_on字段,并在延迟后重置

我希望run_on包含“hello”,延迟60秒,并且可以从其他事务读取,但它不是

我的任务-防止通过不同的JAVA守护进程同时执行相同的job_函数。我想在执行前检查运行情况

我读了很多关于事务级别的文档和博客,但我不明白如何在实践中使用它


如何配置我的函数、表或外部进程以允许其他事务看到这些更改?

PostgreSQL不支持脏读。见:

PostgreSQL的读取未提交模式的行为类似于读取已提交。这是因为这是将标准隔离级别映射到PostgreSQL的多版本并发控制体系结构的唯一合理方法

但看起来有一种称为自治事务的变通方法,可能会对您有所帮助。至少有两种方法可以实现它。请参阅更多信息和


使用这些自治事务,您可以在函数内部提交run_on的更改,以便其他事务能够读取它。

只有一种方法可以做到这一点-通过dblink。比如:

PERFORM dblink('your server config', 'UPDATE ...');

不可能。Postgres永远不允许脏读未提交的更改