【发布时间】:2012-03-23 12:57:24
【问题描述】:
来自docs:
根据 DBI 规范,AutoCommit 的默认值为真值。在这种模式下,对数据库的任何更改都会立即生效。任何
BEGIN、COMMIT或ROLLBACK语句都将被拒绝。 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 文档向我承诺的 BEGIN 和 COMMIT 在哪里?
【问题讨论】:
-
@AntonioDolcetta:确实如此,但我在其中输入的任何语句的测试结果都是相同的。问题已更新。
-
粗体引用的句子似乎实际上描述了(尽管不清楚)当 AutoCommit 关闭时会发生什么。当 AutoCommit 为 ON 时,没有什么可做的,因为 PostgreSQL 服务器将立即提交任何 SQL 语句,除非先前已使用 BEGIN 语句启动了事务。 SQL 服务器本身不支持自动提交 ON/OFF,这就是 DBI 文档所指的“必须显式启动事务的数据库”
标签: perl postgresql dbi