Re: [PHP-PEAR] possible bug in DB/pgsql.php

[email protected] ("Stig S. Bakken")
Newsgroups php.pear
Organization Fast Search & Transfer
Message-ID <[email protected]>
[email protected] wrote:
> 
> On 18 Feb 2001, at 16:11, Stig S. Bakken wrote:
> 
> > > So, at the moment, DB_pgsql does only half of the work. To do it
> > > full, there should be an explicit "begin" somewhere. If this cannot
> > > be "user required" as i suggested in my previous message, the
> > > hard part is finding where...
> > >
> > Ok, what if we take away the implicit "commit" after each query when
> > auto-commit is on, and add an implicit "begin" before each query when
> > auto-commit is off instead?  I would like to avoid having more than one
> > transaction paradigm. :-)
> >
> Yep, this I understand...  doing that way things could work, though
> in a little hackish way.
> i.e. in this way if I'd do (syntax is really pseudo, I've not the
> sources at hand):
> 
> $db->auto_commit(off);
> /* start transaction */
> $db->query(some_query); <- this does a "begin"
> ...some logic...
> $db->query(some_other_query); <- this does another "begin",
>                                                           warning message
> /* close transaction */
> $db->commit();
> 
> For the moment, this would work, since multiple begins raise only
> "NOTICEs" and don't break anything (and you've already showed
> you know how to silence them :-)), but I wouln't choose this
> solution so steadfastly. It's more than possible that future versions
> of pgsql raise errors instead of warnings, or even open a nested
> transaction (OK, this is not in the TODO list for at least next year,
> so we can relax for the moment...), and I'm not even sure that all
> _existing_ versions of pgsql digest the "multiple" begin without
> getting irritated.
> Maybe the problem can be solved using some sort of hidden "flag"
> that tells us if we are in "transaction mode" or not, and using this
> flag to send a "begin" or not.
> 
> i.e. the code for the query method could be something like:
> 
> function query($string)
> {
>         ...
>         if (($this->autocommit==0) && (!$this->trans_block))
>         {
>                 pg_exec($this->conn_id,"BEGIN WORK");
>                 $this->trans_block=TRUE;
>         }
>         ... do query ...
> }
> 
> function commit()
> {
>         if ($this->trans_block)
>         {
>                 pg_exec($this->conn_id,"COMMIT WORK");
>                 $this->trans_block=FALSE;
>         }
>         else
>         {
>                 error("Nothing to commit!");
>         }
> }
> 
> rollback() would be symmetrical, and $trans_block should be init to
> FALSE in the costructor. (again, never mind the sintax, I'm just
> pseudocoding... hope to be readable %-)).
> 
> owever, I'm using hypotethical tense here because AFAIU PEAR
> db object can be used with multiple connections (that is, for each
> page we should have just one $db object but we could have many
> $conn_id, right?), and I'm afraid this way things won't work. Unless,
> instead of using a simple boolean flag, we use this $trans_block
> thingy to store the connection id of each backend that has a
> "pending" connection (but then it could not be a scalar any more).
> So the test to do in the pre-query part should be:
> 
> -"Do I have the present connection in the list of pending transaction
> blocks?"
> {
>         YES: { "Skip the BEGIN statement" }
>         NO: { "Issue the BEGIN statement on the present connection"
>            "Add the present connection to the list of pending ones"}
> 
> And, simmetrically, a commit or rollback should remove the
> connection from the list of pending transactions.
> 
> Hmm, maybe I'm straying too far...I'm not too content of my own
> suggestions. Your turn...

I like this idea.  We might even set up a counter for the number of
operations in a transaction, and only issue "BEGIN" when this counter ==
0.

Thanks a lot for your input!

 - Stig
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.