RJ Herrick wrote:
> Hi all,
> Under mod_perl, what is the correct, safe protocol for using the handle
> attribute mysql_insertid from a persistant handle? Am I correct in
> thinking that I need to clean up attributes like {mysql_insertid}if I
> want to ensure that they are specific to my current call?
> Specifically, could I try to retrieve $dbhandle->{mysql_insertid} after
> a failed insert and accidentally end up with an insertid from a previous
> call? If so, would the best way to guard against this for each use be:
> 
>   $dbhandle->{mysql_insertid} = undef;
>   #Attempt insert here
>   $inserted_id = $dbhandle->{mysql_insertid};
> 
> I went looking and couldn't find anything specifically referencing use
> of the mysql_insertid function call in DBD::mysql.with mod_perl in mind.
> I can't even find the insertid functionality in DBD::mysql, but maybe
> I'm just too tired... Any tangentially related advice would probably
> also be appreciated. Thanks!

First off I think it will help to tell you that MySQL (or database connections
in general) are not shared between Apache children. Even if you're using
Apache::DBI, you will have "persistant" (not disconnected) connections , not
"pooled" (shared) connections.

Having said that, if you're concerned that a child previously attempted an
insert, failed and then started serving your current request then that might be
something different. The database handles by default don't know anything about
different request under mod_perl so you have to do something to let them know.
Apache::DBI solves this by doing the following:

  In order to avoid inconsistencies in the database in case AutoCommit is off
  and the script finishes without an explicit rollback, the Apache::DBI module
  uses a PerlCleanupHandler to issue a rollback at the end of every request.

So if you're using Apache::DBI then everything should be ok. Else, you'll need
you're own similar PerlCleanupHandler.

HTH
-- 
Michael Peters
Developer
Plus Three, LP

Reply via email to