MYSQL script Verzögerung minimieren?

F

Fat32Tony

Gast
Hey.

Ich habe im Moment den Plan mit eine MYSQL Datenbank aufzubauen mithilfe welcher ich verschiedene Aufgaben inform von Befehlen an verschiedene Rechner im Netzwerk verteilt werden.
Was mit an der ganzen Geschichte Sorge macht sind eventuelle Verzögerungen beim schreiben und auslesen, denn ich würde das System so aufbauen, dass die Tabelle

ID / Befehl / Urheber / In Arbeit / fertig / IP-Adresse des bearbeitenden Rechners

Einer der Clients müsste sich also den Befehl holen, welcher am ältersten ist und bei In Arbeit den Wert 0 hat.
Daraufhin müsste er den Wert In Arbeit auf 1 setzen.

Da diese Vorgänge jeweils einen eigenen Verbindungsaufbau zur Folge hätten würde es dort doch unweigerlich zu geringen Verzögerungen kommen, oder irre ich mich?

Ich möchte lediglich verhindern dass einer der "Worker" einen Befehl mehrfach ausführt und sehe hierdrin die einzige Schwierigkeit in diesem System (bei mehr bitte Sagen :D ) und würde deswegen gerne einige Gegenmaßnamen treffen.
Gibt es z.b. eine Möglichkeit beim MYSQL Server die Zugriffe zu beschränken z.b. im Sekundentakt?

lg Tony
 
Der saubere Weg ist eigentlich eine Sperre zu setzen für den kompletten Vorgang. Bei MySQL kenn ich mich da nicht so genau aus, sollte aber auch gehen da eine Transaktion zu setzen die andere aussperrt solange das Lesen und Updaten der Datensätze läuft.
 
Ich verstehe dein Problem nicht so ganz. Du schreibst in eine Tabelle Befehle für ein anderes System.
Die Systeme fragen an der DB an, ob es neue Aufträge gibt, falls nein => Fertig
Falls ja dann setzen sie den Eintrag auf inArbeit=1, führen den Befehl aus. Bei einem Erfolg wird fertig=1 gesetzt, bei einem Fehler wird ein Retry gemacht(oder was auch immer..)
An welcher Stelle sollte es da zu Problemen kommen?

Ungeachtet dessen:
Schau dir mal den Befehl Lock Tables in der MySQL Doku an.
 
Sehe ich ähnlich. Der Auftraggeber generiert den Auftrag in der Tabelle. Der einzige, der den Auftrag anfässt, ist der angesprochene Rechner. Oder sollen die Aufträge dynamisch verteilt werden? Nach dem Motto "Wer zuerst kommt, mahlt zuerst?" In dem Falle solltest du in der Tat die Tabelle bzw. den Datensatz sperren, weil der Fall eintreten kann, dass zwei Clients gleichzeitig einen Auftrag bearbeiten wollen.
Ergänzung ()

Wenn es doch nur zielgerichtete Aufträge sind (zB Client A tu dies; Client B tu das), gibt es erst recht kein Problem. In dem Falle weiß der Client ja, dass er gerade den Auftrag mit ID 4711 gefetcht hat und wird ihn beim nächsten DB-Request ignorieren. Das passiert natürlich nicht automatisch, sondern muss in der Fetch-Routine entsprechend programmiert werden. Beispielsweise so: get_jobs() -> job_id=4711=new -> process_job(4711) -> get_jobs() -> jo_id=4711=old=ignore
 
Ergänzung ()

Wenn es doch nur zielgerichtete Aufträge sind (zB Client A tu dies; Client B tu das), gibt es erst recht kein Problem.

Genau das hatte ich gemeint, dynamisch verteilte Aufgaben an verschiedene Clients. Deshalb ja meine Bedenken^^
 
Zurück
Oben