2012-03-06 40 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

相關問題