[PHP-users 21188]Re: PEARでpostgresqlのトランザクション開始

Tanaka-Qtaro-Yasuhiro tanaq @ ca2.so-net.ne.jp
2004年 4月 8日 (木) 15:39:14 JST


田中久太郎です。

KOYAMA Tetsujiさんの<87isgb3wuj.wl @ poseidon.hoge.org>から
>  ただ単に PEAR DB でトランザクションを利用したいというだけなら、
>
>	$db = DB::connect($dsn);
>	$db->autoCommit(false);

申し訳ありません。言葉が足りなかったようです。

$db->autoCommit(false);をしたうえで、
“SET CONSTRAINTS 〜”文を実行してもトランザクションが開始されないの
です。

PEARのDB/pgsql.phpのソースを見ると、beginを行うタイミングは以下のよう
になっていて、$ismanipな queryじゃないとトランザクションを開始しないの
ですが、

        if (!$this->autocommit && $ismanip) {
            if ($this->transaction_opcount == 0) {
                $result = @pg_exec($this->connection, "begin;");
                if (!$result) {
                    return $this->pgsqlRaiseError();
                }
            }
            $this->transaction_opcount++;
        }

その $ismanipな queryというのは、以下のファンクション(DB.php)で判定される
queryなので、“SET CONSTRAINTS”文ではトランザクションが開始しないのは、
当然といえば当然なのです。

    function isManip($query)
    {
        $manips = 'INSERT|UPDATE|DELETE|'.'REPLACE|CREATE|DROP|'.
                  'ALTER|GRANT|REVOKE|'.'LOCK|UNLOCK';
        if (preg_match('/^\s*"?('.$manips.')\s+/i', $query)) {
            return true;
        }
        return false;
    }

ここで質問なのですが、
PEAR DBでPostgreSQLを利用するときに強制的にトランザクションを開始させる
にはどういった方法が良いのでしょうか?
皆さんの対処法などをご教示いただければ幸いです。





PHP-users メーリングリストの案内