[pgsql-jp: 31540] PEAR::DB pgsqlのautocommitについて

Tanaka-Qtaro-Yasuhiro tanaq @ ca2.so-net.ne.jp
2003年 11月 19日 (水) 22:39:35 JST


田中久太郎です。

PEARのDBを使って PostgreSQLのデータベースを更新するプログラムを
作成しています。
データベースの autocommitを falseにして使用しているのですが、
UPDATEや INSERTを行おうとすると、postgresqlが、
NOTICE:  BEGIN: already a transaction in progress
というエラーを吐きます。

PEARの DB/pgsql.phpの simpleQuery関数を見てみると、以下のように
autocommitがfalseのときに begin; を発行するようになっているので
すが、この動きは正しいのでしょうか?

    function simpleQuery($query)
    {
        $ismanip = DB::isManip($query);
        $this->last_query = $query;
        $query = $this->modifyQuery($query);
        if (!$this->autocommit && $ismanip) {
      ~~~~~~~~~~~~~~~~~~
            if ($this->transaction_opcount == 0) {
                $result = @pg_exec($this->connection, "begin;");
                                                       ~~~~~~
                if (!$result) {
                    return $this->pgsqlRaiseError();
                }
            }
            $this->transaction_opcount++;
        }
        $result = @pg_exec($this->connection, $query);
        if (!$result) {
            return $this->pgsqlRaiseError();
        }
   <<後略>>


【サンプル】
<?php
$dsn = "pgsql://testuser:testpass@testhost/testdb";

$db = DB::connect($dsn, false);

$db->autoCommit(false);

$db->query('BEGIN');
$db->query("UPDATE test_table SET name = 'TEST'");
$db->query('COMMIT');

?>

できれば、さきの注意メッセージが出ないようにしたいのですが。
何か良い回避策をご存知の方がいらっしゃれば教えてください。







pgsql-jp メーリングリストの案内