use POSIX ":signal_h"; my $mask = POSIX::SigSet->new( SIGALRM ); my $dbh = ...; my ($t) = $dbh->selectrow_array("SELECT CONNECTION_ID()"); my $sth = $dbh->prepare("mein select"); my $action = POSIX::SigAction->new( sub { my $dbh = ...; my $foo = $dbh->prepare("kill ?"); $foo->execute($t); die "connection ($t) timeout"; }, $mask, ); my $oldaction = POSIX::SigAction->new(); sigaction( SIGALRM, $action, $oldaction ); eval { alarm 5; $sth->execute(...); alarm 0; }; alarm 0; sigaction( SIGALRM, $oldaction ); if ($@) { ... }