【问题标题】:Do the docs lie about DBD::Pg's AutoCommit?文档是否对 DBD::Pg 的 AutoCommit 撒谎?
【发布时间】:2012-03-23 12:57:24
【问题描述】:

来自docs

根据 DBI 规范,AutoCommit 的默认值为真值。在这种模式下,对数据库的任何更改都会立即生效。任何BEGINCOMMITROLLBACK 语句都将被拒绝。 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)

(请原谅我以 root 身份测试我的脚本!)

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

【问题讨论】:

  • @AntonioDolcetta:确实如此,但我在其中输入的任何语句的测试结果都是相同的。问题已更新。
  • 粗体引用的句子似乎实际上描述了(尽管不清楚)当 AutoCommit 关闭时会发生什么。当 AutoCommit 为 ON 时,没有什么可做的,因为 PostgreSQL 服务器将立即提交任何 SQL 语句,除非先前已使用 BEGIN 语句启动了事务。 SQL 服务器本身不支持自动提交 ON/OFF,这就是 DBI 文档所指的“必须显式启动事务的数据库”

标签: perl postgresql dbi


【解决方案1】:

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

【讨论】:

  • 听起来像是一个合理的猜测......我想知道为什么文档似乎表明它在客户端代码中模拟了这种行为。
  • 我猜测(猜测太多了!)DBI 确实将 BEGIN 和 COMMIT 包装在不支持 AUTOCOMMIT 的数据库的语句中
  • 一个合理的猜测,但 DBD::Pg 的文档应该更清楚。我猜(哇,另一个!)在这一点上,文档已经非常过时了。
  • 请把它也写成一个错误报告,这样它就不会被遗忘。
  • PostgreSQL 在服务器端没有自动提交。上面提到的“会话中自动提交”是 ECPG 特有的功能,它通过不隐式启动任何事务在客户端实现。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    相关资源
    最近更新 更多