coder42
26.05.2008, 11:00:57
Hallo!
Ich arbeite gerade an einem kleinen Shopsystem. Beim Abschluss der Bestellung soll ein neuer Bestell-Datensatz angelegt werden. Hierzu gibt es in einer MySQL Datenbank die Tabelle "Bestellungen", wobei zu jeder Bestellung eine eindeutige Bestellnummer gehört.
Die Bestellnummer ist keine einfache Nummer (1235) sondern setzt sich aus verschiedenen Bestandteilen zusammen, z.B. "2008-CU-12345". Man kann die Nummer daher nicht einfach automatisch hochzählen, sondern muss sie "zusammenbauen"
Ich suche nun nach einer Möglichkeit die Eindeutigkeit einer Kundennummer sicherzustellen. Bis jetzt bin ich so vorgegangen:
1. Bestellnummer der letzten Bestellung ermitteln.
2. Neue Bestellnummer zusammenbauen: ...12345 -> ...12346
3. Neuen Datensatz anlegen.
Nun ist es es aber möglich, dass zwei Bestellungen gleichzeitig ausgelöst werden und somit zwei mal die gleiche Bestellnummer erstellt wird. Das ist zwar relativ unwahrscheinlich aber schon vorgekommen...
Wie kann ich so etwas verhindern?
"Bestellnummer" ist in der Tabelle schon als "unique" deklariert, in obigem Fall erhält also ein Script beim Einfügen die Rückmeldung, dass der Datensatz nicht eingefügt werden kann, weil die Kundennummer schon vorhanden ist...
Jetzt könnte man natürlich einfach nochmal einfügen. Aber theoretisch könnte ja wieder ein anderer Prozess dazwischen kommen, etc...
Klar, wird das in der Praxis nicht sonderlich oft vorkommen, aber es müsste doch eine sichere Methode geben, solche Dinge zu umschiffen...
Ich habe es schon mit einem SubSelect im INSERT versucht. Da die Bestellnummer jedoch recht kompliziert aufgebaut ist, ist es mir nicht gelungen in einem Schritt die vorherige Nummer abzufragen und gleichzeitig die neue Nummer aufzubauen (Muss ja alles in dem Query passieren). Zudem habe ich herausgefunden, dass man beim SubSelect nicht auf die gleiche Tabelle zugreifen kann, auf die sich das INSERT bezieht...
Eine einfache Lösung wäre eine Transaktion, die Tabellen haben jedoch das Format MyISAM und das kann ich auch nicht ändern.
Hat also jemand eine Idee, wie ich hier die Eindeutigkeit sicherstelle?
Besten Dank
Ares
Ich arbeite gerade an einem kleinen Shopsystem. Beim Abschluss der Bestellung soll ein neuer Bestell-Datensatz angelegt werden. Hierzu gibt es in einer MySQL Datenbank die Tabelle "Bestellungen", wobei zu jeder Bestellung eine eindeutige Bestellnummer gehört.
Die Bestellnummer ist keine einfache Nummer (1235) sondern setzt sich aus verschiedenen Bestandteilen zusammen, z.B. "2008-CU-12345". Man kann die Nummer daher nicht einfach automatisch hochzählen, sondern muss sie "zusammenbauen"
Ich suche nun nach einer Möglichkeit die Eindeutigkeit einer Kundennummer sicherzustellen. Bis jetzt bin ich so vorgegangen:
1. Bestellnummer der letzten Bestellung ermitteln.
2. Neue Bestellnummer zusammenbauen: ...12345 -> ...12346
3. Neuen Datensatz anlegen.
Nun ist es es aber möglich, dass zwei Bestellungen gleichzeitig ausgelöst werden und somit zwei mal die gleiche Bestellnummer erstellt wird. Das ist zwar relativ unwahrscheinlich aber schon vorgekommen...
Wie kann ich so etwas verhindern?
"Bestellnummer" ist in der Tabelle schon als "unique" deklariert, in obigem Fall erhält also ein Script beim Einfügen die Rückmeldung, dass der Datensatz nicht eingefügt werden kann, weil die Kundennummer schon vorhanden ist...
Jetzt könnte man natürlich einfach nochmal einfügen. Aber theoretisch könnte ja wieder ein anderer Prozess dazwischen kommen, etc...
Klar, wird das in der Praxis nicht sonderlich oft vorkommen, aber es müsste doch eine sichere Methode geben, solche Dinge zu umschiffen...
Ich habe es schon mit einem SubSelect im INSERT versucht. Da die Bestellnummer jedoch recht kompliziert aufgebaut ist, ist es mir nicht gelungen in einem Schritt die vorherige Nummer abzufragen und gleichzeitig die neue Nummer aufzubauen (Muss ja alles in dem Query passieren). Zudem habe ich herausgefunden, dass man beim SubSelect nicht auf die gleiche Tabelle zugreifen kann, auf die sich das INSERT bezieht...
Eine einfache Lösung wäre eine Transaktion, die Tabellen haben jedoch das Format MyISAM und das kann ich auch nicht ändern.
Hat also jemand eine Idee, wie ich hier die Eindeutigkeit sicherstelle?
Besten Dank
Ares