2 tábla: count, insert és konkurens kérések
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! :)
■ 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! :)
pontosítok
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!
felh1 és <= 2???
Így kapod meg azokat akik több mint egyszer fordulnak elő:
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.
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?
Várnak
+oldva!
Neki is esek és ezzel a problémám megoldva!
Köszönöm! :)