localtimestamp всегда возвращает одно и то же значение - PullRequest
2 голосов
/ 27 ноября 2011

Я недавно портировал форму приложения Perl Oracle на Postgres (мой первый раз с Postgres), и меня озадачила небольшая проблема, которую я смог уменьшить до следующего примера кода:

use strict;
use warnings;
use DBI;

my @db_params = qw (dbi:Pg:host=127.0.0.1;database=test test test);

my $dbh = DBI->connect(@db_params, {AutoCommit => 0 } ) or die ;
while (1) {
    my $sth = $dbh->prepare_cached('SELECT localtimestamp ') or die;
    $sth->execute() or die;
    my $result = $sth->fetchall_arrayref();
    print $result->[0][0] , "\n";
    sleep(5);
}

Это выводит:

2011-11-27 16:46:25.94291
2011-11-27 16:46:25.94291
2011-11-27 16:46:25.94291

Я получаю одну и ту же отметку времени все время, пока я не отсоединяюсь и повторно подключаюсь к базе данных.

Как я могу быть уверен, что когда-нибудь я выберу localtimestamp изв базу данных я получаю значение, соответствующее времени выполнения sql?

Ответы [ 2 ]

5 голосов
/ 27 ноября 2011

Поскольку вы не используете autocommit, вы всегда находитесь в одной и той же транзакции, и localtimestamp получает метку времени в начале этой транзакции в Postgres. То есть вам нужно будет создать отдельные транзакции для ваших запросов, используя $dbh->begin_work и $dbh->commit.

2 голосов
/ 27 ноября 2011

Также ознакомьтесь с руководством для функций statement_timestamp и clock_timestamp.

...