MySQL Forums
Forum List  »  German

Re: Eigener Primärschlüssel
Posted by: Hartmut Holzgraefe
Date: October 07, 2008 06:56AM

Benjamin Andreas Wrote:
-------------------------------------------------------
> Hallo,
>
> ich habe bisher immer "autoincrement" genutzt, um
> einen Primärschlüssel zu erzeugen. Leider
> erzeugt mein MySQL Cluster fehlerhafte Werte.

in wiefern fehlerhaft?

> Wie kann man selbst eine neue ID ermitteln? Mein
> Ansatz ist SELECT max(ID)+1 FROM tabelle.
>
> Problem sind dann andere Threads. Die müßte ich
> dann mit LOCK TABLES stoppen. Richtig?

Das wird nicht funktionieren da ein LOCK TABLES
die Tabelle zwar lokal sperrt, diese table level
locks aber nicht auf die anderen mysqld nodes
weitergegeben innerhalb eines clusters weitergegeben
werden.

D.h. solange sichergestellt ist das alle Anwendungen
immer nur mit genau dem gleichen mysqld innerhalb
des Cluster 'reden' funktioniert der Ansatz, das
läuft dann aber jeglicher Lastverteilung innerhalb
des Clusters zuwieder.

> Nur ich verstehe den Unterschied zwischen LOCK
> TABLES read und write nicht. Laut Doku erlaubt
> READ für andere Threads das Lesen, aber nicht das
> Schreiben. Und WRITE dann das Schreiben, aber
> nicht das LESEN?

Ein READ lock verhindert das Schreiben,
ein WRITE lock verhindert das Schreiben *und*
lesen durch andere Verbindungen.

> Ich müsste dann doch beides sperren, damit nicht
> zwei Threads gleichzeitig mit dem SELECT max(ID)+1
> die gleiche ID erzeugen. Richtig?

Ja, und deshalb braucht es ein WRITE lock ...

Besser wäre in Deinem Fall aber eine zusätzliche
Sequenztabelle in der Du die ID hochzählst, etwa so:

BEGIN TRANSACTION;
SELECT id FROM sequence_table WHERE sequence_id = ... FOR UPDATE;
UPDATE sequence_table SET id = id + 1 WHERE sequence_id = ...;
COMMIT;

Mit SELECT ... FOR UPDATE bekommst Du row level
write locks statt gleich die ganze Tabelle zu sperren
und solche row level locks gelten auch clusterweit.

Was genau an den autoincrement Werten "fehlerhaft" sein
soll interessiert mich aber nach wie vor? Eventuell handelt
es sich ja nur um ein Konfigurationsproblem und Du könntest
Dir die ganzen Umwege sparen?

--
Hartmut Holzgraefe, MySQL Regional Support Manager EMEA

Sun Microsystems GmbH, Sonnenallee 1, 85551 Kirchheim-Heimstetten
Amtsgericht Muenchen: HRB161028
Geschaeftsfuehrer: Thomas Schroeder, Wolfgang Engels, Dr. Roland Boemer
Vorsitzender des Aufsichtsrates: Martin Haering

Options: ReplyQuote


Subject
Views
Written By
Posted
6471
October 07, 2008 06:39AM
Re: Eigener Primärschlüssel
3180
October 07, 2008 06:56AM
2476
October 08, 2008 06:29AM
2561
October 08, 2008 06:54AM
2485
October 08, 2008 07:11AM
2572
October 08, 2008 06:41AM


Sorry, you can't reply to this topic. It has been closed.

Content reproduced on this site is the property of the respective copyright holders. It is not reviewed in advance by Oracle and does not necessarily represent the opinion of Oracle or any other party.