PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : mySQL - exklusiver Variablenzugriff


Gast
2008-12-01, 01:21:34
Hallo,
ich entwickle ein kleines Programm, das Aufträge aus einer mySQL Datenbank ausließt und zuteilt. Übernimmt ein Client einen Auftrag, soll in die Datenbank sein Name geschrieben werden und der Auftrag für die anderen nicht mehr angezeigt werden.
Soweit so gut, aber es wäre ja theoretisch möglich, dass ein Auftrag gleichzeitig von 2 Clients angeklickt wird und damit gleichzeitig von der Datenbank abfragen ob der Auftrag frei ist.
Ich müsste also vor dem Abfragen den Eintrag in der Datenbank sperren, sodass die Abfragen von allen anderen Clients auf den Auftrag erstmal pausiert werden.

Wie geht das in mySQL? Ich hoffe meine Erläuterung ist halbwegs verständlich ;)

darph
2008-12-01, 08:17:10
http://en.wikipedia.org/wiki/Database_transaction

Wenn der Zweite auch nur eine Millisekunde später draufdrückt, bekommt er eine Fehlermeldung, daß der Auftrag schon vergeben ist. Die Fehlermeldung mußt du natürlich implementieren.

Gast
2008-12-01, 14:59:39
sprich es ist gar nicht möglich, dass beide gleichzeitig select auf der Datenbank ausführen und deshalb beide die Antwort bekommen, der Auftrag ist noch frei?

Gast
2008-12-01, 15:01:30
Hm, irgendwie wird mir nicht ganz klar, ob mySQL das jetzt schon von Haus aus regelt, oder ob ich das noch irgendwie deklarieren muss...

Gast
2008-12-01, 15:34:48
ok hab mir jetzt mal ein buch ausgeliehen. muss man selber machen

Gast
2008-12-01, 16:00:27
Transaktionen werden nur für InnoDB Tabellen unterstützt. Und nu? :(

Marscel
2008-12-01, 19:46:05
Ich weiß es nicht besser, aber würde es nicht möglich sein, ein Feld "locked_by" hinzuzufügen, dass bei offenen Aufträgen 0 ist und bei angenommenen die entspr. Client-ID hat? Das dann an eine Bedingung im SELECT hängen. Ich weiß nur nicht genau, ob MySQL intern exakt im selben Moment 2x auf die selbe Zeile zeigen tut.

Gast
2008-12-02, 13:17:36
Marscel: Es ist zwar sinnvoll, die ID dessen zu speichern, der den Auftrag schliesslich bekommen hat. Aber das garantiert keinen Ausschluss eines anderen. Transaktionen mit den entsprechenden lock-Mechanismen sind ein MUSS.

Gast: InnoDB ist sowieso die gescheitere Wahl, wenn ich mich recht entsinne, unterstützt MyISAM ja nicht mal Foreign Keys etc.

Marscel
2008-12-02, 14:15:11
Gut zu wissen, bisher musste ich zwar nichts derartig kritisches tun, aber ich ging noch davon aus, dass sich jede Anfrage bezüglich einer Zeile/Feld schön in die Reihe stellen würde. Deadly wrong :D

daflow
2008-12-03, 17:32:04
Marscel: Es ist zwar sinnvoll, die ID dessen zu speichern, der den Auftrag schliesslich bekommen hat. Aber das garantiert keinen Ausschluss eines anderen. Transaktionen mit den entsprechenden lock-Mechanismen sind ein MUSS.

Gast: InnoDB ist sowieso die gescheitere Wahl, wenn ich mich recht entsinne, unterstützt MyISAM ja nicht mal Foreign Keys etc.

Ist die erst Db-Engine (die sich auch so schimpft) von der ich höre, die keine Transaktionen, lockmechanismen und Foreign Keys unterstützt... und das Ding darf sich wirklich Datenbank nennen? Also wenns hier wirklich um eine "kritische" Anwednung geht, dann würd ich die Wahl der Engine mal schwer in Frage stellen :redface:

darph
2008-12-04, 10:00:05
Also wenns hier wirklich um eine "kritische" Anwednung geht, dann würd ich die Wahl der Engine mal schwer in Frage stellen :redface:
Und genau deshalb gibt's ja jetzt innoDB.