Lev Lvovsky wrote:
1 -> STORE for DBD::mysql::db (DBI::db=HASH(0x9bf49cc)~INNER 'AutoCommit' 0) thr#915dc30In testing out persistent connections while using transactions, we've noticed that while in a loop which continuously begins and ends a transaction, killing the persistent connection which Apache::DBI is maintaining causes the still-running handler to report things like: error: DBD driver has not implemented the AutoCommit attribute at /usr/lib/perl5/vendor_perl/5.8.8/i386-linux-thread-multi/DBI.pm line 1668.--> do_errorTurning off AutoCommit failed error 21 recorded: Turning off AutoCommit failed<-- do_error STORE DBI::db=HASH(0x9bf49cc) 'AutoCommit' => 0 !! ERROR: 21 CLEARED by call to begin_work method-> begin_work for DBD::mysql::db (DBI::db=HASH(0x9b8678c)~0x9bf49cc) thr#915dc30
So, your code is calling begin_work, fetching a value, storing a value, and committing? The store will fail if the database connection goes away, and it'll do so when it attempts communicate with the server to set AutoCommit to 0.
You might want to call $dbh->ping before calling your store routine. Either way, the way to make this fault tolerant is with eval.
Once you've determined that there's been a fault, and that the fault means that the database is down, try to reconnect. Continue to try to reconnect until the database comes back online. Then retry the original failed transaction.
Once you reconnect, the connection is persistent again. At least, that's been my experience with postgresql.
Rob
Mail converted by mhonarc 2.6.15
This archive provided courtesy of JSW4.NET, Internet Hosting Services for Small Business.