localtimestamp始终返回相同的值

时间:2011-11-27 14:01:55

标签: perl postgresql dbi

我最近将一个Perl应用程序表单移植到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 个答案:

答案 0 :(得分:5)

因为您没有使用自动提交,所以您始终处于同一事务中,而localtimestamp在Postgres中获取该事务开始时的时间戳。即您需要使用$dbh->begin_work$dbh->commit为您的查询创建单独的交易。

答案 1 :(得分:2)

另请查看statement_timestampclock_timestamp函数的manual