ugrás a tartalomhoz

2 tábla: count, insert és konkurens kérések

EL Tebe · 2010. Május. 5. (Sze), 18.25
Sziasztok!
Milyen megoldást érdemes alkalmazni az alábbi problémára?

Mindkét tábla innoDB és mysql-ről van szó (5.5)
PHP-ből küldözgetem a parancsokat, sima mysql_query()-kkel

tabla1:
felh1
felh1
felh2
felh3
felh4

tabla2:
csoport1
csoport2

Ha az első táblában megszámlálom count-tal hogy hányszor szerepel a felh1 és <= 2,
akkor illesszen be egy (vagy az eredménytől függően több) új sort a tabla2-be.

A gondom az, hogyha az első lekérdezés lefutott és még az insert előtt egy konkurens lekérdezés ugyanilyen formában lekérdezi szintén a tabla1-et, akkor a feltétel mindkét esetben teljesül és az insertek így dupla annyi sort fognak beilleszteni, mint amennyi kéne.

Kb. addig jutottam, hogy az egésszet egy tranzakcióba foglalom, a feltételrendszert, ami a beszúrásra vonatkozik pedig tárolt eljárásba teszem. Bár ezektől szerintem még nem süt ki a nap :)
Láttam többféle lock-olást, viszont az nem jó megoldás, hogy vmilyen hibaüzenetet kapjak vissza, ha nem elérhető az adat (vagy ha fenti lekérdezésen kívül más lekérdezés szeretne hozzáférni az adathoz)
- inkább valahogy "késleltetni" kéne a konkurens lekérdezéseket.

Ezt mivel tudom megtenni és hogyan?

Köszi a válaszokat - így előre is! :)
 
1

pontosítok

EL Tebe · 2010. Május. 5. (Sze), 18.32
Hogy lássátok miről van szó: előre fixen meghatáozott "helyeket" lehet lefoglalni egy-egy csoportban (amikhez a csoport létrejöttekor fix adatok tartoznak).

Minden felhasználó több helyet is foglalhat egy csoporton belül és minden egyes foglaláshoz egyéni adatok vannak rendelve (pl. foglalás időpontja).

Amennyiben megtelik az adott csoport és minden hely le lett foglalva, automatikusan létrejön (több másik adatbázistábla alapján) egy új csoport.

--

Ha a fenti elképzelés nem jó, és van más megoldás, mert a logikában van gond, az is érdekel!
2

felh1 és <= 2???

Poetro · 2010. Május. 5. (Sze), 19.26
Most akkor mikor szúrsz be új sort?
Így kapod meg azokat akik több mint egyszer fordulnak elő:
SELECT felhasznalo FROM tabla1 GROUP BY felhasznalo HAVING COUNT(felhasznalo) > 1
És akik legfeljebb kétszer:
SELECT felhasznalo FROM tabla1 GROUP BY felhasznalo HAVING COUNT(felhasznalo) <= 2
Azt nem értem, miért jó neked hogy beszúrsz egy sort a tabla2 táblába, ha legfeljebb 2-szer fordul elő a felhasznaló. Mert ha mondjuk 0-szor fordul elő, akkor is beszúrsz egyet? Meg ha egyszer? Meg ha kétszer?
Ennek így körülbelül se füle se farka.

Ahogy szerintem kellene lennie:
Amikor beszúrnál egy felhasználót, megnézed, hogy a csoport az megtelt-e. Ha megtelt, akkor létrehozol egy csoportot, és a felhasználót az új csoportba teszed. Érdemes lehet előtt lock-olni a táblát, hogy ne akarjon két lekérdezés egyszerre vizsgálni a csoport megteltségét, mert akkor két csoport jöhet esetleg létre.
3

itt tartok

EL Tebe · 2010. Május. 5. (Sze), 19.29
igen, azthiszem itt tartok:
"Amikor beszúrnál egy felhasználót, megnézed, hogy a csoport az megtelt-e. Ha megtelt, akkor létrehozol egy csoportot, és a felhasználót az új csoportba teszed. Érdemes lehet előtt lock-olni a táblát, hogy ne akarjon két lekérdezés egyszerre vizsgálni a csoport megteltségét, mert akkor két csoport jöhet esetleg létre."

Az érdekelne, hogyha lock-olom a vizsgálandó táblát, akkor minden más lekérdezés a lock idejére hibaüzenetet dob? Vagy vár amíg a lock-ot feloldom?
4

Várnak

Poetro · 2010. Május. 5. (Sze), 19.40
Addig várnak, amíg nem tudnak olvasni az adatbázisból, vagy amíg le nem jár az rendelkezésre álló idő, amikor is hibaüzenetet fog dobni.
5

+oldva!

EL Tebe · 2010. Május. 5. (Sze), 19.49
Ha várnak, akkor minden szuper :)
Neki is esek és ezzel a problémám megoldva!
Köszönöm! :)