Gå til innhold

MySql: Låse tabell for oppdatering


Anbefalte innlegg

Har følgende utfordring:

 

En tabell personinfo som oppdateres av brukere via en html-form.

 

Ser ut slik:

nr-navn-adresse-tlf

 

En webside viser en oversikt over ledige tidspunkt, brukeren blir, via en hyperlink (en for hver ledig plass), sendt til en html-form for å taste inn sine opplysninger.

Tabellen på websiden:

nr -blank-blank-blank-reserver-> (link) Hvis plassen er ledig.

nr-navn-adresse-telefon-opptatt ->(ikke link) Hvis plassen er opptatt.

 

Når brukeren sender formen, oppdateres tabellen der brukeren valgte å reservere. Hyperlinken er selvsagt nå fjernet.

 

Promlemet er vel et synkroniseringproblem. Det vil kunne oppstå tilfeller der flere bruker velger samme rad i tabellen og dermed bli sendt til html-formen. Den som sender formen sist "vinner". Sistnevnte kan selvfølgelig løses med å sette inn noe midlertidig i tabellen(og så sjekke på kolonne i tabellen før bruker få oppdattere) mens brukeren gjøre seg ferdig, men jeg vil ikke gjøre det på den måten. Bruker nr 2, 3 osv som har klikket en allerede brukt link i tabellen må få beskjed om at plassen er opptatt.

Det jeg er ute etter er vel at plassen skal være låst i noen minutter til første bruker har rukket å gjøre seg ferdig. Vil ikke sette inn noe midlertidig i tabellen heller pga bruker kan ombestemme seg og forlate formen uten at noe er skrevet inn og sendt.

 

Noen som har et forslag på hvordan jeg kan løse dette?

 

-torms

Lenke til kommentar
Videoannonse
Annonse

hmmm... hva slags system er dette?

 

jeg tenker med en gang plassregistreringssystem for dataparty (noe jeg har programmert endel ganger nå), og da bruker jeg å ha at brukerne har registrert bruker og passord (slik at de kan gå inn å flytte plasser etterpå...) og så bare trykker på linken som så endrer plassID fra 0 til nummeret på plassen....

Lenke til kommentar

forresten, en ting du kan gjøre er å legge inn: "locked int(11) default '0'" og så sjekke om den er 0, i såfall tillate at man bruker den, ellers sjekke om den er satt (noe som vil si at noen prøver å ta den)

 

$locked = query("SELECT locked FROM tabell");
$lock = fetch($lock);
$l = $lock->locked;
if($l == 0) {
// tillat at brukeren klikker seg inn her....
}
elseif($l != 0 && $l < time()-3600) { 
// Det er mer enn en time siden noen var inne her, fjern sperringen...
query("UPDATE tabell SET locked = 0 WHERE tabellID = $tabellID");
}

else {
// Noen holder på å reservere....
}

 

Grovt tenkt...

Lenke til kommentar

Du trenger ikke å skrive et eget script for det. Dette er et vanlig problem å finnes løsninger for dette i sql. Ta en kikk på table lock. Med MySQL kan du låse tabeller, page og rader.

 

Radlåsing er kun tilgjenlig med InnoDB, Page låsing er kun tilgjenlig med BDB mens låsing av tabellen er tilgjenlig for ISAM, MyISAM og HEAP.

Endret av ????????
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...