2012-03-06 62 views
3

docs文档是否对DBD :: Pg的AutoCommit说谎?

按照DBI规范自动提交默认为真值。在此模式下,对数据库的任何更改立即生效。任何BEGIN,COMMITROLLBACK声明将被拒绝。 DBD :: Pg通过在执行语句之前立即发出BEGIN语句和之后的COMMIT来实现AutoCommit。

我的测试脚本:

#!/usr/bin/perl 

use strict; 
use warnings; 
use DBI; 

my $dbh = DBI->connect("dbi:Pg:dbname=test"); 
print "AutoCommit = $dbh->{AutoCommit}\n"; 
$dbh->do('INSERT INTO foo(x) VALUES (1)'); 

脚本输出:

自动提交= 1

我的日志(与log_statement = 'all'):

2012-03-05 20点21分02秒CST rootLOG:语句:INSERT INTO FOO(X)VALUES(1)

(!原谅我测试我的脚本根)

在哪里BEGINCOMMIT我是由DBD :: Pg文档承诺的?

+0

@AntonioDolcetta:确实如此,但测试结果与我放入其中的任何陈述相同。问题已更新。 – Flimzy 2012-03-06 03:01:39

+0

粗体引用的句子似乎实际上描述了(尽管不清楚)AutoCommit为OFF时会发生什么。当AutoCommit为ON时,由于PostgreSQL服务器将立即提交任何SQL语句,除非事务先前已用BEGIN语句启动,否则无事可做。 SQL服务器本身不支持自动提交ON/OFF,这是DBI文档所指的“必须显式启动事务的数据库” – 2012-03-07 03:33:16

回答

1

我已经通过我自己的测试得出结论,这是DBD :: Pg文档中的一个错误。因此,我已将CPAN提交给Bug #82356,CPAN已于2013年2月8日解决。

1

我猜AutoCommit = 1会在服务器端将会话标记为AUTOCOMMIT,请参阅http://www.postgresql.org/docs/9.1/static/ecpg-sql-set-autocommit.html。 为了确保我们必须查看dbi :: Pg源代码。

+0

听起来像是一个合理的猜测......我想知道为什么文档似乎表明它模拟客户端代码中的行为。 – Flimzy 2012-03-06 04:06:15

+0

我在猜测(这么多猜测!)DBI的确会将BEGIN和COMMIT包装在本来不支持AUTOCOMMIT – AntonioD 2012-03-06 04:09:13

+0

的数据库的语句周围,但DBD :: Pg的文档应该更清楚。我猜(whoa,另一个!)在这一点上,文件只是非常过时。 – Flimzy 2012-03-06 05:23:13