Ik ben bezig in MySQL(InnoDB)/PHP een systeem te bouwen waarmee je met meerdere gebruikers iets kan kopen, maar loop tegen een schaalbaarheidsissue aan wat me maar niet lukt om te tackelen.
Het concept is een spel, waarbij er huizen gebouwd kunnen worden. Een huis kost altijd 100, en bestaat uit hout/glas/steen. Een huis wordt gevormd als de som van alle grondstoffen 100 is. Dus als dit de biedingen zijn:
De reden waarom ik de tabel lock voor de transactie (1), is omdat ik wil voorkomen dat een andere transactie (2) dmv een SELECT query ook de "50 hout" te zien krijgt en daarmee gaat rekenen of er ook 100 gevormd kan worden, terwijl die eventueel aan het eind van transactie (1) niet meer aanwezig hoeft te zijn.
Ik wil dit graag ombouwen naar een constructie waarbij de table lock achterwege kan blijven. Daarvoor is het (denk ik) noodzakelijk om de rijen die in de transactie (1) worden gebruikt (mbv SELECT/DELETE), überhaupt niet zichtbaar te maken voor transactie (2), ook niet voor SELECT queries.
Volgens mij kan ik dit niet oplossen met een ander Isolation Level, omdat READs (SELECTs) altijd mogelijk blijven.
Is er een methode om dit slimmer/anders te doen, begrijp ik MySQL niet helemaal goed, of zie ik iets over het hoofd?
Het concept is een spel, waarbij er huizen gebouwd kunnen worden. Een huis kost altijd 100, en bestaat uit hout/glas/steen. Een huis wordt gevormd als de som van alle grondstoffen 100 is. Dus als dit de biedingen zijn:
- Speler 1 biedt 50 hout,
- Speler 2 biedt 30 glas,
- Speler 3 biedt 20 steen,
- De hele table locken,
- Transactie starten,
- Kijken wat de hoogste biedingen zijn op hout, glas en steen,
- Als die samen 100 zijn, deze biedingen op 'afgehandeld' zetten, en verplaatsen naar een andere tabel
- Transactie beëindigen
- Table vrijgeven
De reden waarom ik de tabel lock voor de transactie (1), is omdat ik wil voorkomen dat een andere transactie (2) dmv een SELECT query ook de "50 hout" te zien krijgt en daarmee gaat rekenen of er ook 100 gevormd kan worden, terwijl die eventueel aan het eind van transactie (1) niet meer aanwezig hoeft te zijn.
Ik wil dit graag ombouwen naar een constructie waarbij de table lock achterwege kan blijven. Daarvoor is het (denk ik) noodzakelijk om de rijen die in de transactie (1) worden gebruikt (mbv SELECT/DELETE), überhaupt niet zichtbaar te maken voor transactie (2), ook niet voor SELECT queries.
Volgens mij kan ik dit niet oplossen met een ander Isolation Level, omdat READs (SELECTs) altijd mogelijk blijven.
Is er een methode om dit slimmer/anders te doen, begrijp ik MySQL niet helemaal goed, of zie ik iets over het hoofd?