phpbar.de logo

Mailinglisten-Archive

Record Locking?

Record Locking?

Florian Schmidt mysql_(at)_lists.phpcenter.de
Tue, 27 Mar 2001 14:56:18 +0200


Hallo allerseitz!

Ich habe ein Problem, bei dem ich nicht weiterkomme. (MySQL 3.23.33 WinNT)

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.

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....
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 



php::bar PHP Wiki   -   Listenarchive