phpbar.de logo

Mailinglisten-Archive

Record Locking?

Record Locking?

stepken mysql_(at)_lists.phpcenter.de
Tue, 27 Mar 2001 16:56:30 +0200


Am Dienstag 27 März 2001 14:56 schrieb Florian Schmidt:
> Hallo allerseitz!
>

> Wir haben mehere Rechner, die lesend und schreibend auf einen SQL-Server
>  über ODBC zugreifen.
> Die Problemstellung ist wie folgt:
> 	Rechner1 fügt neue Records in eine Tabelle ein.
> 	Rechner[2-n] lesen diese Tabelle.
> 		Dabei soll ein bestimmter record nur von einem Rechner bearbeitet
> 		werden.

Transaktionen braucht man nicht unbedingt, insert delayed reicht 
normalerweise auch aus ....

> In unserem Fall sind in der Tabelle aufträge, die mit priorität, start und
> endzeit angegeben sind.
> Einer der Rechner[2-n] soll nun die 1. 10 der Datensätze mit der geringsten
> prio,
> und gültigem start und end-datum bearbeiten. Dabei muss aber sichergestellt
> werden,
> dass kein anderer Rechner diesen Record sieht/versucht zu bearbeiten.
>
> Bisher habe ich folgenden ansatz:
> Ich führe einen einzigen SQL-Befehl aus, der mir von den gültigen aufträgen
> die
> 1. 10 mit der geringsten prio mit einer prio+(1000 * RECHNER_NUMMER) setzt.
> Dann nimmt kein anderer Rechner diese Aufträge mehr in beschlag, da die
> prio
>
> > 100 ist, und nun kann dieser eine rechner eine select-anfrage ausführen,
>
> um die soeben
> markierten records zu bekommen/bearbeiten.
> Das ganze setzt also darauf, das dieser eine update befehl die datensätze
> markiert, ohne dass ein update befehl eines anderen rechners zu gleichen
> zeit den gleichen record markiert.....
>
> Mein Problem ist allerdings, dass ich in einem update-befehl kein order by
> angeben
> kann, sprich ich schaffe es nicht, dass er mit nur die 1. 10
> *mit der niedrigsten prio* markiert.
>
> Mein bisheriger Update-befehl: (Rechner 1)
> update auftrag set PRIO=PRIO+1000
> where ((start_time<=now()) and (term_time>now()) and (prio<100)) limit 10;
>
> Damit sind die records markiert, kein anderer rechner bearbeitet sie, und
> Rechner 1 kann nun mit
>
> select * from auftrag where prio>=1000 and prio<2000;
>
> die markierten datensätze abarbeiten.
>
> kann mir jemand einen tipp geben? Die ganze Tabelle zu locken will ich
> verhindern, da das zu sehr ausbremst....

Das bremst überhaupt nicht, wenn nur ein Rechner schreibt ....

> Es ist bei MySQL nicht möglich eine SELECT abfrage als datenquelle für
> einen update-befehl zu verwenden, oder ?
>
> bedanke mich im voraus...
>
> --
> Florian Schmidt
> mailto:schmidt_florian_(at)_f-24.com
> http://www.f-24.com
>
> ---
> *** Weitere Infos zur Mailingliste und MySQL unter http://www.4t2.com/mysql

-- 
Linux is like a wigwam - No GATES, no WINDOWS and there is a APACHE inside ..
Have fun !

---
*** Weitere Infos zur Mailingliste und MySQL unter http://www.4t2.com/mysql 



php::bar PHP Wiki   -   Listenarchive