At sikre, at data kun ændres af 1 bruger ad gangen
Nu kan jeg ikke lige huske den programeringsmæssige betegnelse for denne mekanisme, men jeg vil gerne sikre mig, at mine data i et datagrid kun kan behandles af 1 bruger ad gangen. Altså skal der komme en fejl, hvis en bruger forsøger at ændre dataene, hvis en anden bruger allerede er ved at ændre dataene.
Jeg mener, at dette også kan implementeres i .NET? (jeg bruger c# som codebehind) Jeg vil meget gerne se et kodeeksempel også...
Nu har jeg læst lidt om "lock". Og så vidt jeg kan forstå, så kan jeg blot skrive lock(this) inde i metoden. Metoden bliver aktiveret, når brugeren er inde i datagrid'et, og editere nogle rows. Når dette gøres, skal det IKKE være muligt, at slette den pågældende row. Kan dette ikke klares ved brug af "this" inde i metoden?
Jamen, er 2 tråde ikke det samme som 2 brugere/klienter? Det er jo antal klienter, som er hele problematikken i dette spørgsmål. Kan "lock" så ikke benyttes alligevel?
er det ikke at sætte en application-variabel når at en bruger går i edit-mode? Når den anden bruger prøver at slette nogen skal denne application-variabel tjekkes, og hvis den er sat til true, skal brugeren få en fejl om at rækken ikke kan slettes da den er ved at blive ændret af en anden.
et giver så nogle ekstra tjek der skal laves, f.eks. hvis brugeren der er ved at ændre i dit grid forlader sitet... på den måde vil variabel altid stå til true. Dette kan afhjælpes ved at have noget overvågning der tjekker om der er aktivitet fra den bruger der er i "edit-mode".
A hva? Den forstod jeg ikke helt :-) Hvad er "versioning"-pattern? Det har jeg aldrig hørt om. Og tættere på DB. Jeg bruger en xmlfil som DB. Og mellem xmlfilen og aspxfilen(med codebehind), har jeg en c#fil, som udfører forskellige udtræk. Og det er jo nok heri, at lock'en skal laves.
XML filer er ikke gode til fler bruger opdateringer
men principielt kan versioning også bruges med det
ideen er simpel: - en række har et versions nummer - alle kan frit hente data - men når der skal gemmes testes der om versionsnummer passer hvis ikke så fejl ellers gemme rman og bumper version nummeret
Der findes også låse mekanismer i både .NET og databasen, men de bør bruges til ting som tager tusinde dele eller miliontedele sekunder ikke til ting somn tager minutter
start lock hent dokument fra disk igen sammenlign version i det der skal gemmes med version fra disk hvis samme så læg en til version gem på disk ellers giv fejl til bruger end lock
Det var jo så koden, jeg har brug for. Desuden vil dette eksempel jo nok ikke fungere, da der vel godt kan være en anden bruger, som netop er ved at rette i i row'en. Så vil versionen vel være den samme. Og så får den første bruger lov at slette row'en, hvilket han ikke må. Så låsemekanismen i .Net er jo nok løsningen. Jeg går ud fra, at der skal oprettes en variabel eller lign. på serveren, som så checkes, når jeg skal ændres i row'en. Det samme senario udføres vel ved lock? Men hvordan laves denne løsning i koden (og ikke pseudo)?
Var det funktioanlitteten af 13/05-2005 19:32:28 ? Ud fra pseudokoden kan jeg ikke se, at serveren ved af, at bruger 1 er ved at ændre data, hvorved bruger 2 så netop får adgang til at slette data.
Jeg ved ikke umiddelbart, hvad CVS, RCS og PVCS er.
Men selvfølgelig skal der også være indbygget en form for timeout. Egentlig skal brugeren jo blot ændre i en enkelt linie. Så timeout'ten er rigelig lang, hvis den er på 15-20 sek.. Men dette kan jeg jo implmentere mig ud af. Det er selve lock'en, som er problemet for mig.
Hmm, jeg er vist ude, hvor jeg ikke kan bunde lige nu :-)
Jeg tror, at jeg kan løse problemet, hvis jeg blot kan oprette et objekt på serveren, som jeg så kan lock()'e på. Men hvordan laver jeg sådan et object? Hvis jeg angiver det i codebehind, så oprettes der vel et lokalt objekt for hver bruger, som ser på siden? Jeg har forsøgt at løse problemet ved, at lave en tekstfil, som har de kritiske oplysninger i sig. Og denne fil er så det kritiske objekt. Men hvordan synkroniserer man på den? Kan man lave stien til filen i en "string", som man så synkroniserer på (altså synkroniserer på string'en)?
Ja, det mente jeg nu også. Jeg kom bare meget i tvivl, da jeg tænkte på, at en aspx-side jo kører ved hver klient. Og derfor kom jeg i tvivl, om en static variabel så ikke bare blev kontrueret på serveren ud fra den enkelte bruger. Altså så der kom et antal statiske variabler svarende til det antal brugere, som på et givet tidspunkt var online.
nope... en statisk variabel findes jo kun een gang pr. klasse. og da en aspx-side jo egentlig er en klasse, så findes denne statiske variabel for en given aspx-side også kun een gang.
klasserne til aspx-filerne (og codebehind) bliver gemt i en temp-mappe der hvor .Net frameworket er installeret. Det er det der gør at man kan f.eks. overskrive dll-filerne i bin-mappen uden problemer, da disse også bliver kopieret med over.
Men som Arne er inde på, så skal jeg heller ikke kunne sige om der laves en ny instans hver ved hvert request, eller om de genbruges. Men det er sådan set underordnet når man bruger en static-variabel.
og ang. alt ens html på en aspx-side, så bliver det compilet til en LiteralControl("din html"). Det kan du f.eks. se hvis du løber igennem control-hireakiret på en aspx-side.
jeg har lige testet - det ser meget ud som om der bliver lavet en instans per request
virker meget fornuftigt - det var næppe god at antage at ASP til ASP.NET konvertitterne altid vil skrive thread safe kode - men det undrer mig at der ikke er en attribut i page direktivet til at ændre det
Jeg tænkte det nok. Men hvad vil det så sige? Skal jeg så lave en tråd, som kører på serveren? Og hvordan får jeg så sat den i gang, så den kun bliver oprettet som 1 instans?
my friendly and professional advise; drop det. Jeg kan ikke på nogen måde se hvordan at variable-locking skal kunne komme til at fungere på tværs af requests i et stateless miljø som asp.net.
Jeg vil gå efter mit forslag i 11/05-2005 23:23:47, med at sætte flag i Application. På den måde er du sikker på at bibeholde flagene på tværs af requests. Evt. kan du gemme det i Cache istedet og sætte en timeout på.
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.