SPUG: Question on Class::DBI, MySQL, mod_perl locking

Kevin Fink kevin-spug at fink.com
Tue Dec 8 20:04:53 PST 2009


I have a very simple dynamic page that is not working, and I'm not
sure what I'm doing wrong. The page loads a record out of a database
and displays a variety of options for one of the fields. When the user
submits one of those, the page saves that back into the database, then
loads the next applicable record. About as simple as you can get.
Everything works fine, except when I try to submit the data the first
time, nothing changes in the database, and the second time I try to
submit it locks until the request times out with the following error:

COD::DB::Domain COD::DB::Domain=HASH(0x552b689d40) destroyed without
saving changes to domain_category_id at
/usr/lib64/perl5/vendor_perl/5.8.5/x86_64-linux-thread-multi/ModPerl/RegistryCooker.pm
line 202
[Tue Dec 08 19:38:58 2009] [error] Can't update 5200: DBD::mysql::st
execute failed: Lock wait timeout exceeded; try restarting transaction
[for Statement "UPDATE domain\nSET    domain_category_id = ?\nWHERE
domain_id=?\n"] at
/usr/lib/perl5/site_perl/5.8.5/DBIx/ContextualFetch.pm line 52, <FH>
line 27.\n at /var/www/cod/domains.cgi line 30\n

The relevant section of code is:

{
...
       my $record = COD::DB::Domain->search(domain => $domain)->first;
        $record->domain_category_id($id);
        $record->update;
}

COD::DB::Domain isa Class::DBI. domain_category_id is a FK to another
table, represented by COD::DB::DomainCategory (but I don't think
that's relevant here - but could very easily be wrong).

>From what little I understand of Class::DBI I thought the DB
transaction would be committed when $record goes out of scope, but I
don't think that's happening, so when I grab the next domain I get the
same one again (since it's still available for changes), and then it
starts to chase its tail. If I restart the web server between each
submission I don't get the lock, but nothing gets changed in the
database.

So how do I get the record to be updated so the next web call sees the change?

I can make the updates via the MySQL client without any problems, so
I'm assuming it's a mod_perl/Class::DBI issue.

Apache/2.0.52
This is perl, v5.8.5 built for x86_64-linux-thread-multi
Class::DBI version 3.0.17
MySQL 4.1.22

Any thoughts?

Kevin


More information about the spug-list mailing list