Wenn Du mit DBI arbeitest, dann solltest Du Dir die Attribute PrintError bzw. PrintWarn ansehen, die es u.a. beim Database-Handle gibt. Allenfalls ist auch RaiseError von Interesse.
RaiseError brauch ich schon, damit das script nicht abschmiert.
hier der spameintrag:
myscript.cgi: DBD::mysql::db do failed: Duplicate entry 'id-6' for key 1 at ../mymodule.pm line 597.
das mit den attributen könnte hilfreich sein. wo finde ich da eine beschreibung? im dbi-modul wird nur von RaiseError geschrieben :(
Aber da Du ja nicht genau sagst, wie Du das gemacht hast (Code-Schnipsel), ist das alles nur eine Herumraterei.
#--------------------------------------------------------------------------------
db_lock
#--------------------------------------------------------------------------------
sub db_lock
{
my $tabelle = shift;
my $wert = shift;
my $check = shift;
local $dbh->{RaiseError};
my $statement = "insert into lhb_lock
(tabelle, wert, id, datneu)
values
('$tabelle', '$wert', $id, SYSDATE())";
my $rv = $dbh->do($statement);
return $rv if $rv || defined($check);
my $time1 = time() + 180;
my $count = 0;
until ($rv || ($time1 < time()))
{
$count++;
sleep(0.1 * $count**1.5);
$rv = $dbh->do($statement);
}
unless ($rv)
{
dblog("Fehler beim locken von $tabelle $wert", 1);
get_tmpl('dummy');
$html->param(text => 'Es ist ein schwerwiegender Fehler aufgetreten!');
end_script;
#stop_all(1, "Wegen technischen Problemen");
}
}
#--------------------------------------------------------------------------------
db_unlock
#--------------------------------------------------------------------------------
sub db_unlock
{
my $tabelle = shift;
my $wert = shift;
$dbh->do("delete from lhb_lock where tabelle = '$tabelle' and wert = '$wert'");
}