Screening mit MySQL implementieren

Screening mit MySQL implementieren

am 31.01.2007 10:59:08 von Frank Buss

Ich möchte ein Screening implementieren, also die Datensätze einer Tabelle
jeweils einmal anzeigen und dann als angezeigt markieren, in 100'er
Schritten. Also sowas:

create table image (
id int auto_increment,
adminUser int,
primary key (id));

Soweit kein Problem, ich führe ein

select * from image where adminUser is null limit 100

aus und Update anschließend alle adminUser-Felder der zurückgelieferten
Menge. Nun können aber von mehreren Stellen parallel User darauf zugreifen
und die image-Tabelle darf ich nicht locken, da dort auch von anderer Seite
dauernd geschrieben wird. Wie kann man sowas am besten lösen?

Eine Idee, die ich jetzt implementiert habe, nutzt folgende zusätzliche
Tabelle:

create table adminImage (
id int auto_increment,
primary key (id));

Ich füge jetzt als id jeweils die zurückgelieferte id der Image-Tabelle ein
und wenn das fehlschlägt mit einem duplicate key entry, dann nehme ich an,
daß dieser Eintrag bereits gescreent wurde. Löst man das im allgemeinen so,
oder gibt es da was besseres?

--
Frank Buss, fb@frank-buss.de
http://www.frank-buss.de, http://www.it4-systems.de

Re: Screening mit MySQL implementieren

am 31.01.2007 14:38:07 von Sven Paulus

Frank Buss wrote:
> Ich möchte ein Screening implementieren, also die Datensätze einer T=
abelle
> jeweils einmal anzeigen und dann als angezeigt markieren, in 100'er
> Schritten. Also sowas:
> create table image (
> id int auto_increment,
> adminUser int,
> primary key (id));
> Soweit kein Problem, ich führe ein
> select * from image where adminUser is null limit 100
> aus und Update anschließend alle adminUser-Felder der zurückgeliefer=
ten
> Menge. Nun können aber von mehreren Stellen parallel User darauf zugre=
ifen
> und die image-Tabelle darf ich nicht locken, da dort auch von anderer Se=
ite
> dauernd geschrieben wird. Wie kann man sowas am besten lösen?

Warum machst Du nicht einfach gleich ein

UPDATE image SET adminUser =3D 'eugen'=20
WHERE adminUser IS NULL AND screened =3D 0
LIMIT 100

danach dann ein=20

SELECT id, field1, field2, ... FROM image
WHERE adminUser =3D 'eugen' AND screened =3D 0

Und wenn die Dinger dann angezeigt wurden, dann als angezeigt
markieren:

UPDATE image SET screened =3D 1
WHERE adminUser =3D 'Eugen' AND screened =3D 0

(oder einzelen anhand des id-Felds, etc., je nachdem, was Du
ueberhaupt vor hast)

Du musst natuerlich sicherstellen, dass der gleiche User nicht
mehrfach parallel zugreift.

Re: Screening mit MySQL implementieren

am 31.01.2007 15:09:03 von Frank Buss

Sven Paulus wrote:

> Warum machst Du nicht einfach gleich ein
>
> UPDATE image SET adminUser = 'eugen'
> WHERE adminUser IS NULL AND screened = 0
> LIMIT 100

Gute Idee, wusste nicht, daß man limit auch bei Updates einsetzen kann. Wie
kann ich aber sicherstellen, daß die auch der Reihenfolge nach markiert
werden, also wenn "image" eine "id" hat, entsprechend "order by id"? Das
scheint bei dem update nicht zu gehen.

--
Frank Buss, fb@frank-buss.de
http://www.frank-buss.de, http://www.it4-systems.de

Re: Screening mit MySQL implementieren

am 01.02.2007 14:43:41 von Sven Paulus

Frank Buss wrote:
>> UPDATE image SET adminUser =3D 'eugen'=20
>> WHERE adminUser IS NULL AND screened =3D 0
>> LIMIT 100
> Gute Idee, wusste nicht, daß man limit auch bei Updates einsetzen kann=
.. Wie
> kann ich aber sicherstellen, daß die auch der Reihenfolge nach markier=
t
> werden, also wenn "image" eine "id" hat, entsprechend "order by id"? Das
> scheint bei dem update nicht zu gehen.

Doch, sicherlich, schau einfach mal auf die Syntax-Beschreibung im
Handbuch:

http://dev.mysql.com/doc/refman/5.0/en/update.html