Mailinglisten-Archive |
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