繁体   English   中英

PostgreSQL-在特定时间开始交易

[英]PostgreSQL - Start a transaction in specific time

我在寻找一种在特定时间启动FunctionTransaction的方法( 以测试并发访问 ),但是我在PostgreSQL中找不到一个明确的方法-使两个事务同时运行 ,需要执行一些操作在特定时间使用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中有没有比这更好的类似方法。

从PostgreSQL 9.6开始,您可以导出和导入数据库快照 ,这使您可以有效地同时启动两个事务。

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

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

你可能更好地利用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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM