Skip site navigation (1) Skip section navigation (2)

Re: pg_transaction_status() unreliable?!

From: Bill Moran <wmoran(at)potentialtech(dot)com>
To: Kenneth Marshall <ktm(at)rice(dot)edu>
Cc: ljb <ljb1813(at)pobox(dot)com>, pgsql-php(at)postgresql(dot)org
Subject: Re: pg_transaction_status() unreliable?!
Date: 2009-05-04 20:57:04
Message-ID: 20090504165704.b8a0027d.wmoran@potentialtech.com (view raw or flat)
Thread:
Lists: pgsql-php
In response to Kenneth Marshall <ktm(at)rice(dot)edu>:

> On Mon, May 04, 2009 at 03:34:21PM -0400, Bill Moran wrote:
> > In response to ljb <ljb1813(at)pobox(dot)com>:
> > 
> > > wmoran(at)potentialtech(dot)com wrote:
> > > >
> > > > I'm having some ugly fun here.  It doesn't seem as if
> > > > pg_transaction_status() is reliable in the least.
> > > >
> > > > For example, I'm doing the equivalent of the following:
> > > >
> > > > pg_send_query_params($conn, 'BEGIN', array());
> > > > pg_get_result($conn);
> > > > ... some other queries, each using pg_send_query_params() and
> > > >  pg_get_result() ...
> > > > pg_send_query_params($conn, 'COMMIT', array());
> > > > pg_get_result($conn);
> > > > echo pg_transaction_status($conn);
> > > >
> > > > Now, amazingly enough, pg_transaction_status() returns
> > > > PGSQL_TRANSACTION_ACTIVE after the commit.  This makes no sense to
> > > > me at all ... it should return PGSQL_TRANSACTION_IDLE, since the
> > > > connection is no longer in a transaction.
> > > >
> > > > Is anyone else seeing this?  I have assertions failing all over the
> > > > place because my code thinks that transactions have been left
> > > > uncommitted.
> > > 
> > > One needs to loop on pg_get_result() until it returns False. Are you doing
> > > this?
> > 
> > No.  There's no documented reason that I can see to do so ;)
> > 
> Here is the statement in that manual to which he is referring:
> 
> PQgetResult
> 
>     Waits for the next result from a prior PQsendQuery, PQsendQueryParams,
>     PQsendPrepare, or PQsendQueryPrepared call, and returns it. A null
>     pointer is returned when the command is complete and there will be no
>     more results.
> 
>         PGresult *PQgetResult(PGconn *conn);
>        
> 
>     PQgetResult must be called repeatedly until it returns a null pointer,
>     indicating that the command is done. (If called when no command is
>     active, PQgetResult will just return a null pointer at once.) Each
>     non-null result from PQgetResult should be processed using the same
>     PGresult accessor functions previously described. Don't forget to
>     free each result object with PQclear when done with it. Note that
>     PQgetResult
> 
> ...

Not that it says anything about PQtransactionStatus being affected by
the use of it.  If I read this literally, PQgetResult could return a
result set that is incomplete, which begs the question: how do I merge
the remaining part of the result set when I get it back next time?

Of course, that's not the intended usage, which leads me to wonder
what's going on when I know factually that I have no more query
results pending, yet I have to call it again (apparently) to update
the client's internal status data structures.

Oh well, I guess that's just the quirks of the client library.

-- 
Bill Moran
http://www.potentialtech.com
http://people.collaborativefusion.com/~wmoran/

In response to

Responses

pgsql-php by date

Next:From: ljbDate: 2009-05-05 01:20:32
Subject: Re: pg_transaction_status() unreliable?!
Previous:From: Bill MoranDate: 2009-05-04 19:34:21
Subject: Re: pg_transaction_status() unreliable?!

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group