Avatar billede Slettet bruger
07. maj 2003 - 19:18 Der er 17 kommentarer og
1 løsning

Stoppe overbooking

Hej.

Jeg har lavet et system i php og Mysql hvor man kan reservere pladser. Det kører sådan at man ikke kan reservere flere pladser end dem der er til rådighed.

Men hvis nu 2 til 3 stykker sidder og tæller ned og trykker send samtidig får de alle tre pladser selvom der rent faktisk ikke er flere pladser end til den første.

Findes der en metode til at undgå det ? og hvad skal man lede efter for at stoppe dette, hvis man kan det ? eller er her en der har en løsning fra et system, gerne med en god forklaring, så det er til at finde ud af :)

På forhånd tak.
Avatar billede Slettet bruger
07. maj 2003 - 19:25 #1
Når du sætter deres reservering ind i MySQL tjekker du vel om der er ledige pladser?
Avatar billede jakoba Nybegynder
07. maj 2003 - 19:29 #2
Du skal sørge for at check og reservation sker samlet i eet enkelt script. det må ikke være fordelt over flere websider.

så kan du foretage test og reservation som een enklet udelelig operation på databasen.

mvh JakobA
Avatar billede Slettet bruger
07. maj 2003 - 19:39 #3
Jeg har lavet det sådan, at der når der trykkes på send checkes om der nu virkelig er de pladser tilrådighed, og er der ikke det kommer der en fejl, ellers gennemføres bestillingen.

Det er kun der hvor nogen vil lave rav i den det vil gå galt, og det ville jeg jo gerne prøve at tage højde for, og det kniber lige med idér til hvordan man kan gøre det. Een fortalte man kunne låse databasen imens men booker, men så vil det vil gå ud over alt muligt andet. Man kan vel ikke låse et felt ud af mange felter.
Avatar billede jakoba Nybegynder
07. maj 2003 - 19:42 #4
Databasen skal så også supportere det.

en simpel og effektiv måde kunne være at oprette en lille tabel med de pladser der er til rådighed og så makrkere dem som 'optaget' eftrehånden som de bliver solgt:

$sql_kommando = "
    UPDATE pladser_i_bus_2346
    SET optaget = 'yes'
    WHERE optaget = 'no'
    limit 0,1
";

mysql_query ( $sql_kommando );

if ( mysql_affected_rows() == 1 ) {
    echo "Tillykke, deres plads er nu reserveret."
    // registrer navn og adresse osv
} else {
    echo "Beklager alt udsolgt."
}

mvh JakobA
Avatar billede Slettet bruger
07. maj 2003 - 19:47 #5
>Ja, men jeg har en rutine der nedskriver pladser :) Det er til noget styring af biografer for skoler og der er ud for hver film lavet et felt med antal pladser. De nedskrives så efterhånden som de bliver brugt, og når der ikke er flere får man det at vide. Men der sker altså ikke det rigtige hvis flere sender nøjagtig samtidig. De får alle tilsendt en mail med besked om at de har pladserne, men det er altså kun den ene af dem der var plads til.

Det er vist svært at forklare ordentligt. Jeg tror jeg vil se om jeg ikke kan lave det så systemet kan ses i brug. Det kører kun intranet lige nu.
Avatar billede Slettet bruger
07. maj 2003 - 20:00 #6
Jeg har dette før der godkendes:

if ($pladser >= $deltag) {
$_SESSION["Plads"] = $pladser;
} else {
?>
  <center><font color="#000000">
  <?php
      echo 'Der kan ikke bestilles så mange pladser ' . '!<br>Der er kun ' . $pladser . ' tilbage.<br><br>';

Jeg kan ikke lige få det på nettet.
Avatar billede jakoba Nybegynder
07. maj 2003 - 20:14 #7
Problemet er at når du læser antal pladser på eet tidspunkt of første senere siger "reserver den plads" så kan andres reservationer nå at blande sig. det må de ikke.

med den lille tabel ovenfor 07/05-2003 19:42:05 bliver pladsen reserveret samtidig med at du spørger om der er en ledig plads. intet kan komme indimellem.
Avatar billede Slettet bruger
07. maj 2003 - 20:15 #8
"Men der sker altså ikke det rigtige hvis flere sender nøjagtig samtidig"

Nej, men der er jo heller ikke nogen der sender _præcis_ samtidigt, og MySQL kan ikke lave 2 queries på _præcis_ samme tid.

Men MySQL understøtter heldigvis låsning af tabeller hvis du mener at det er nødvendigt.
Avatar billede Slettet bruger
07. maj 2003 - 20:18 #9
Jo testen gik ud på at flere skulle sende samtidigt, og det gik galt. I det virkelige liv vil det være meget usandsynligt at det vil ske, men "nogen" er bange for at det kan ske.
Man skal ramme samme by, film, dato, klokkeslet på samme brøkdel af et sekund for at det vil gå galt.

Vil det hjælpe hvis man kan låse et felt mens de opdateres ?
Avatar billede Slettet bruger
07. maj 2003 - 20:22 #10
Jeg tror jeg har fundet en fejl. sql update kommer først efter den har lavet mail og den skal vel komme i den if sætning jeg sendte tidligere. Kan det ikke også hjælpe på problemet ?
Avatar billede Slettet bruger
07. maj 2003 - 20:53 #11
Jeg tror den ændring vil hjælpe noget på problemet, og er vel også som JacobA foreslog tidligere.

Men det hjælper altid at snakke/skrive om problemerne, også selvom der måske ikke lige kommer en løsning. Bare det at lufte problemet hjælper nogen gange. Hvem vil have point ? Eller vil I dele fordi I begge kom mmed tips til at tænke over. TAK.

Viser det sig ikke at være nok, vender jeg tilbage med et nyt spørgsmål.
Avatar billede jakoba Nybegynder
07. maj 2003 - 21:03 #12
Ja og nej. Det er korrekt at jo mindre afstand der er imellem at du spørger 'er der en ledig plads' og du siger 'reserver den plads', jo mindre er risikoen. men der vil stadig være en risiko sålænge du ikke slår de to ting sammen til een enkelt query.

du kan opnå det samme med LOCK og UNLOCK http://www.mysql.com/doc/en/LOCK_TABLES.html som el_barto er inde på, og det er nok en nemmere løsning at klistre på et system der allerede er lavet. Men du skal være opmærksom på at det kan gøre dine sider grumme sløve for ny kan ingen andre bruge den løste tabel før du låser den op igen.
Avatar billede Slettet bruger
07. maj 2003 - 21:09 #13
ok jacoba, men er det ikke kun den tabel med DEN film, eller gælder det hele databasen ?
Avatar billede jakoba Nybegynder
07. maj 2003 - 21:14 #14
jo det er kun den ene tabel.
Avatar billede Slettet bruger
07. maj 2003 - 21:16 #15
Ja jeg så lige på dit link, og det skal jeg vist først læse når jeg har sovet ;) Tak for hjælpen, og så må du gerne lægge et svar, og det skal el_barto vel også og så deler I da I vist begge er kommet med løsninger til problemet ?
Avatar billede jakoba Nybegynder
07. maj 2003 - 21:48 #16
ok
Avatar billede Slettet bruger
07. maj 2003 - 23:16 #17
jeg springer over denne gang ;)
Avatar billede exp Juniormester
08. maj 2003 - 10:12 #18
Jeg mener der er mulighed for at tildele et felt en værdi allerede inden indsættelse (altså sådan at brugeren får en unik værdi når de loader registreringsside) -- noget med noget @-værk...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester