【问题标题】:PostgreSQL - Start a transaction in specific timePostgreSQL - 在特定时间启动事务
【发布时间】:2017-02-20 11:18:16
【问题描述】:

我正在寻找一种在特定时间启动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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    您最好使用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
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多