PostgreSQL - 在特定时间开始交易

问题描述 投票:-1回答:3

我寻找一种在特定时间内启动FunctionTransaction的方法(为了测试并发访问),但我找不到一个明确的方法,我在这里找到PostgreSQL - make two transactions run at the same time,在特定时间用linux执行脚本的东西,但如果您使用的是Windows或其他操作系统,这没有用。

我创建了一个简单的方法,但我不确定这是否有问题:

我创建了一个接受start-date的函数,然后在这个函数中我使用pg_sleep(sleep_time)阻止我的动作直到那个时候,所以这个想法很简单:

sleep_time = start_date - current_date

这是功能:

CREATE OR REPLACE FUNCTION start__my_job_in_specific_time(start_time timestamp) RETURNS INTEGER AS $$
     BEGIN
       PERFORM pg_sleep((select extract(epoch from (start_time - (SELECT CURRENT_TIMESTAMP)))));
       -- now execute my actions
       UPDATE sch_lock.table_concurente set max_value = max_value + 1 
       WHERE id = (SELECT id FROM sch_lock.table_concurente ORDER BY id DESC LIMIT 1);
       RETURN (SELECT MAX(max_value) FROM sch_lock.table_concurente);
     END;
     $$ 
LANGUAGE plpgsql;

-- start my function at 2017-02-20 12:03:30
SELECT * FROM start__my_job_in_specific_time('2017-02-20 11:03:30');

这项工作很好,交易工作在准确的时间。

我的问题:在postgres中有没有比这更好的方法。

sql postgresql concurrency transactions plpgsql
3个回答
1
投票

你可能最好使用clock_timestamp()然后 - CURRENT_TIMESTAMP将返回事务启动的ts,而不是函数运行启动:

t=# begin;
select pg_sleep(2);
do
$$
begin
  raise info '%',concat('CURRENT_TIMESTAMP: ',CURRENT_TIMESTAMP,' realtime: ',clock_timestamp());
end;
$$
;

end;
BEGIN
 pg_sleep
----------

(1 row)

INFO:  CURRENT_TIMESTAMP: 2017-02-20 11:40:59.294505+00 realtime: 2017-02-20 11:41:01.295338+00
DO
COMMIT

2
投票

从PostgreSQL 9.6开始,您可以使用export and import database snapshots,它允许您在同一时刻有效地启动两个事务。

您必须将快照名称从一个程序传递到另一个程序。

当然,只有在第一个事务仍然在运行时启动第二个事务才有意义,因此除了您的方法之外,它还可以使用。


0
投票

您应该能够做一些与您在问题中链接的答案非常相似的事情。只需使用操作系统中可用的任何调度机制来安排两个psql命令同时执行。在Windows中,使用内置的任务计划程序。

或者,如果您有能力,您可以创建一个简单的应用程序,在不同的连接和线程上执行命令。只需使用同步对象来同步命令执行。

© www.soinside.com 2019 - 2024. All rights reserved.