03. september 2003 - 21:45Der er
14 kommentarer og 2 løsninger
Låse tabel?
Hej,
Jeg har to tabeller som styrer en menu på mit site.Den ene tabel (menu) holder styr på hvilken rækkefølge menupunkterne skal sorteres og den anden (content) indeholder selve indholdet af de forskellige menupunkter. Det fungerer også fint nok, men jeg er lidt i tvivl om hvor sikker min metode er hvis der er flere brugere der på samme tid forsøger at ændre i menuen. Her er et eksempel på hvad der sker når der skal indsættes et menupunkt over et eksisterende:
'## Vælg id som der skal indsættes et nyt menupunkt over strSelectidSQL = "SELECT * FROM menu WHERE id = " & intActionid & "" Set SelectidRS = Conn.Execute(strSelectidSQL)
'## Læg 1 til menu_sortorder for alle menupunkter med menu_sortorder større '## eller lig det menupunkt vi indsætter over strUpdateidInfoSQL = "UPDATE menu SET menu_sortorder = menu_sortorder+1 WHERE parent_id = " & SelectidRS("parent_id") & " AND menu_sortorder >= " & SelectidRS("menu_sortorder") & "" Conn.Execute(strUpdateidInfoSQL)
'## Indsæt nyt menupunkt strInsertNewidSQL = "INSERT INTO menu(parent_id,menu_sortorder) VALUES(" & SelectidRS("parent_id") & "," & SelectidRS("menu_sortorder") & ")" Conn.Execute(strInsertNewidSQL)
'## Vælg sidst indsatte id strSelectLastInsertedRecord = "SELECT LAST_INSERT_ID() AS intLastId FROM menu" Set LastRecordRS = Conn.Execute(strSelectLastInsertedRecord)
'## Indsæt indhold i content tabellen strInsertIntoContentSQL = "INSERT INTO content(id) VALUES (" & LastRecordRS("intLastId") & ")" Conn.Execute(strInsertIntoContentSQL)
Der jeg er bange for det går galt er i UPDATE sætningen, så hvis jeg har ret hvad gør jeg så for at forhindre dette? Det skulle gerne være en løsning hvor flere brugere samtidigt kan tilføje menupunkter, men uden at det på nogen måder laver konflikter med andre brugere.
Teoretisk kan det godt ske, hvis du vil være helt sikker så må det være noget med at tildele hver bruger der logger på et unikt nummer, noget med milisekunder der er gået indtil nu siden midnat sammensat med et tilfældigt tal mellem 1000000 og 9999999 (eller noget lignende), og så skrive det tal med ned i tabellen ved oprettelsen af en record. for så at få det id laver du bare en "select max(id) from tabel where uniqueid="+ditunikkebrugerid
>> arne_v At SelectidRS("menu_sortorder") er den samme for begge er ikke noget problem, for i UPDATE sætningen (strUpdateidInfoSQL) ligger den 1 til menu_sortorder hvor menu_sortorder er større eller lig med SelectidRS("menu_sortorder"), og i strInsertNewidSQL indsætter den SelectidRS("menu_sortorder") hvilket også er hvad den skal.
At lave om på tabel-strukturen er desværre ikke en mulighed, så at bruge LOCK TABLES og UNLOCK TABLES er nok vejen frem, men hvordan gør jeg?
Og ja, det er formentlig ikke mere end et 1 cifret antal samtidige brugere.
>> -mundi-- Hmm, det kunne man selvfølgelig gøre, men det kræver en omstrukturering af mine tabeller, og det duer ikke desværre. Men tak for svaret.
Ok, det var jo let nok så, men er det ikke noget med at man også kan sige LOCK TABLES tabelnavn READ? Så hvad er forskellen på READ og WRITE, kan gætte mig til at det er noget med læse/skrive rettighedder, men for hvem?
Hvis du starter med LOCK og slutter med UNLOCK, så kommer process 2 ikke til (heller ikke med SELECT) førend process 1 er helt færdig.
Synes godt om
Ny brugerNybegynder
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.