我最近将一个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时相对应的值?
答案 0 :(得分:5)
因为您没有使用自动提交,所以您始终处于同一事务中,而localtimestamp在Postgres中获取该事务开始时的时间戳。即您需要使用$dbh->begin_work
和$dbh->commit
为您的查询创建单独的交易。
答案 1 :(得分:2)
另请查看statement_timestamp
和clock_timestamp
函数的manual。