Thread Lock auf MySql-table notwendig? (12 answers)
Opened by gast at 2010-12-24 15:35

topeg
 2010-12-26 17:29
#143829 #143829
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Guest gast
2010-12-26T08:54:19 topeg
Ein Datenbank versucht Änderungen so schnell wie möglich allen anderen Nutzern zu Verfügung zu stellen und dabei die Integität der Datensätze zu erhalten. Dem Nutzer werden verschiedenen Hilfsmittel zur Verfügung gestellt, die das unterstützen.

Man kann die Option "AutoCommit=>1" bei DBI setzen und damit ein sofortiges verteilen aller gemachten Aktionen fordern. Ansonsten werden die Änderungen erst allen anderen zur Verfügung gestellt, wenn man $dbh->commit() ausführt oder die Verbindung zur DB schießt.

Intressant. Du schreibst "allen anderen Nutzern". Gilt das auch für Prozesse?

Ja es sind alle zugreifenden Prozesse gemeint, die eine Berechtiguung haben, diese Tabelle zu lesen.

Guest gast
Würdest du die Rückgabe mit einem eval auswerten?
Code: (dl )
1
2
3
4
5
6
7
8
9
my $i = 4;
eval {
my $sql = qq(insert into test values (?));
my $sth = $dbh->prepare($sql);
$sth->execute($i);
};
if ($@) {
print "$@\n";
}

Der Code gibt 2 mal folgende Meldung aus:
"DBD::mysql::st execute failed: Duplicate entry '4' for key 'xxx' [for Statement "insert into test values (?)" with ParamValues: 0=4] at ./a.pl line 18"

Du musst eval nutzen, wenn RaiseError => 1 gesetzt ist. Ansonsten kann man auch so was schreiben (ungetestet):
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
my $i = 4;
my $sth_ins = $dbh->prepare('insert into test values (?)')    || die("Can't prepare Statement!".$dbh->errstr."\n")
my $sth_sel = $dbh->prepare('select id from test where id=?') || die("Can't prepare Statement! (".$dbh->errstr.")");
if($sth_ins->execute($i))
{
  print "Set new value\n";
}
else
{
  # einfügen nicht erfolgreich testen ob es den Eintrag schon gibt?
  # wenn es zu Fehlern kommt stimmt Irgend etwas anderes nicht.
  my $err=$dbh->errstr;
  if($sth_sel->execute($i) && $sth_sel->fetchrow_arrayref()->[0] == $i)
  {
    # der Eintrag existiert. Die Fehlermeldung muss nicht Ausgeben werden.
    print "Allready exists\n";
  }
  else
  { die("Can't insert Value! $err\n") }
}
$sth_ins->finish;
$sth_sel->finish;

View full thread Lock auf MySql-table notwendig?