On Thu, 2006-09-07 at 12:29 -0700, Jay Buffington wrote:
> But, that handle might have expired, so it is possible to get a
> different handle.

It's not likely, but it is possible.  You'd need to have some transient
error that caused the connection to die between DBI calls.  (Not during
a call, since you have RaiseError on, right?)

>   I'm worried that it's not safe to do this:
> 
> use Apache::DBI;
> use DBI;
> 
> my $dbh = DBI->connect(...);
> $dbh->do("insert values('foo') into bar');
> 
> # time passes... and then:
> 
> my $new_dbh = DBI->connect(...);
> $new_dbh->commit();

My approach is to keep AutoCommit on, and turn it off for the brief
periods where I want a transaction to span multiple statements.

{

    local $dbh->{AutoCommit} = 0;
    ### do some SQL actions here

} # commit happens automatically here

> Of course, I might just be whining about a corner case that never
> exists in real life.  If the handle is active when I do the insert,
> it's probably going to be active when I do the commit moments later.

If it worries you, you could modify Apache::DBI to die rather than
reconnect if the handle has been requested previously in the current
request.  This is pretty easy to keep track of with pnotes.

- Perrin

Reply via email to