PostgreSQL - 在特定时间开始交易

时间:2017-02-20 11:18:16

标签: sql postgresql concurrency transactions plpgsql

我搜索了在特定时间内启动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中有任何类似的方式比这更好。

3 个答案:

答案 0 :(得分:2)

从PostgreSQL 9.6开始,你可以export and import database snapshots,它允许你在同一时刻有效地开始两个交易。

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

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

答案 1 :(得分:1)

你最好使用clock_timestamp()然后 - CURRENT_TIMESTAMP将返回事务开始的ts,而不是函数run start:

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 :(得分:0)

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

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