Avatar billede lucifers Nybegynder
10. maj 2005 - 16:44 Der er 47 kommentarer

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å...
Avatar billede arne_v Ekspert
10. maj 2005 - 16:57 #1
C# har et keyword lock til at synkronisere adgang i multithreadede sammenhænge
Avatar billede arne_v Ekspert
10. maj 2005 - 17:01 #2
lock(mylock)
            {
                // kode som kun kan køres af en tråd (per instans af mylock variablen naturligvis)
            }
Avatar billede lucifers Nybegynder
10. maj 2005 - 17:42 #3
Så jeg skal blot lave tilgangen til datagrid'et gennem en codebehindfil?
Og skal der stå "mylock" i parantesen, eller hvordan fungerer det?
Avatar billede arne_v Ekspert
10. maj 2005 - 17:46 #4
mylock er det objekt du vil synkronisere på

I dit tilfælde lyder det som det var oplagt at synkronisere på dit DataGrid objekt

(men du kan bruge hvad som helst som optræder i samme antal instanser som din
DataGrid)
Avatar billede lucifers Nybegynder
10. maj 2005 - 18:32 #5
ah, okay. Det må jeg lige se, om jeg kan få til at fungere så...
Avatar billede lucifers Nybegynder
10. maj 2005 - 20:45 #6
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?
Avatar billede arne_v Ekspert
10. maj 2005 - 20:53 #7
Det tror jeg ikke
Avatar billede arne_v Ekspert
10. maj 2005 - 20:59 #8
lock beskytter mod at to tråde kører det stykke kode (eller andre stykker kode
somlock'er på det samme) kører samtidigt - ikke mere
Avatar billede lucifers Nybegynder
10. maj 2005 - 21:59 #9
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?
Avatar billede arne_v Ekspert
10. maj 2005 - 22:06 #10
Jo - for ASP.NET vil 2 samtidige brugere være 2 tråde.

Men låsen forsvinder jo når man når }.

Og det gør man jo inden brugeren ser noget HTML i sin browser.
Avatar billede lucifers Nybegynder
11. maj 2005 - 20:20 #11
Kan man ikke bare lave c#-koden inde i selve HTML'en? Og så bare konstruere det sådan, at '}' først kommer, nåe brugeren er færdig med koden?
Avatar billede lucifers Nybegynder
11. maj 2005 - 20:46 #12
Der er også noget der hedder "monitor" i c#. Kan det bruges i mit tilfælde?
Avatar billede burningice Nybegynder
11. maj 2005 - 23:23 #13
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.
Avatar billede burningice Nybegynder
11. maj 2005 - 23:24 #14
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".
Avatar billede lucifers Nybegynder
13. maj 2005 - 09:24 #15
Ja, det er lige nøjagtig dét, der er problemet. Men kan det så ikke løses ved brug af "lock(this)" i codebehind, hvor ændringen skal foretages fra?
Avatar billede arne_v Ekspert
13. maj 2005 - 09:42 #16
monitor er faktisk bare en mere low level version af lock
Avatar billede arne_v Ekspert
13. maj 2005 - 09:43 #17
jeg tror at du skal kigge på versioning pattern på et lavereniveau (tættere
på DB)
Avatar billede lucifers Nybegynder
13. maj 2005 - 10:29 #18
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.
Avatar billede arne_v Ekspert
13. maj 2005 - 11:31 #19
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
Avatar billede lucifers Nybegynder
13. maj 2005 - 15:48 #20
Så kan versionering sikkert godt bruges i dette tilfælde. Men hvordan benyttes det så? Har du et kodeeksempel?

Jeg vil stadig meget gerne se et eksempel på 11/05-2005 23:23:47 & 11/05-2005 23:24:57. Denne løsning tiltaler mig nemlig også meget.
Avatar billede arne_v Ekspert
13. maj 2005 - 19:32 #21
lige ud af landevejen

lidt pseudo kode:

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
Avatar billede lucifers Nybegynder
13. maj 2005 - 20:03 #22
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)?
Avatar billede arne_v Ekspert
13. maj 2005 - 20:13 #23
bruger nummer to vil få en fejl når han forsøget at gemme (eller slette for den
sags skyld)
Avatar billede lucifers Nybegynder
13. maj 2005 - 20:41 #24
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.
Avatar billede lucifers Nybegynder
13. maj 2005 - 20:56 #25
... hvorved bruger 2 så netop IKKE får adgang til at slette data. :-)
Avatar billede arne_v Ekspert
13. maj 2005 - 21:06 #26
det er ikke traditionel locking

det er ikke ham som henter først der "vinder"

det er ham som gemmer først der "vinder"

men det er altid kun en rettelse som går igennem og den anden får en fejl

hvis du kender til source control systemer så er det her CVS mens traditionel
locking er RCS, PVCS etc.

ulempen ved traditionel locking i denne her sammenhænger er timeout - hvornår
vil du time en lock ud
Avatar billede lucifers Nybegynder
14. maj 2005 - 08:22 #27
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.
Avatar billede arne_v Ekspert
14. maj 2005 - 10:38 #28
hvis du vil bruge den form for locking så kan du:

start lock
  hvis id er i hashtable så
      giv fejl til bruger
  ellers
      sæt id i hashtable
      returner data
end lock
Avatar billede lucifers Nybegynder
15. maj 2005 - 15:24 #29
Jeg er ikke helt med. Bliver der automatisk oprettet en hashtable ved runtime?
Avatar billede arne_v Ekspert
15. maj 2005 - 15:53 #30
det er en som skal oprettes specielt til formålet
Avatar billede lucifers Nybegynder
15. maj 2005 - 22:40 #31
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)?
Avatar billede arne_v Ekspert
15. maj 2005 - 22:42 #32
hvis du laver et static field i din klasse så locker alle ihvertfald på det samme
Avatar billede lucifers Nybegynder
17. maj 2005 - 09:28 #33
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.
Avatar billede burningice Nybegynder
17. maj 2005 - 09:36 #34
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.
Avatar billede lucifers Nybegynder
17. maj 2005 - 15:22 #35
Jamen, så lærte jeg da også lidt i dag :-)
Så man skal opfatte en aspx-side som en desideret klasse, og IKKE som noget HTML/Web-agtigt noget?
Avatar billede arne_v Ekspert
17. maj 2005 - 15:35 #36
browseren requester en URL fra IIS

som resultat af det bliver der kaldt noget kode der genererer noget HTML

jeg formoder at ASP.NET processer og compiler .aspx filen første gang den kaldes

og så kan den kalde den compilede kode hver gang fremfor at fortolke siden

jeg er ikke klar over om den laver en instans af klassen per request eller
kun en eller en pool
Avatar billede lucifers Nybegynder
17. maj 2005 - 16:00 #37
Ah, det er vist rigtigt nok. Der bliver jo genereret nogle DLL-filer ved kompilering. Det er nok bl.a. disse, som fungerer som en klasse.
Avatar billede burningice Nybegynder
17. maj 2005 - 22:53 #38
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.
Avatar billede burningice Nybegynder
17. maj 2005 - 22:54 #39
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.
Avatar billede arne_v Ekspert
18. maj 2005 - 21:31 #40
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
Avatar billede lucifers Nybegynder
19. maj 2005 - 09:02 #41
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?
Avatar billede burningice Nybegynder
19. maj 2005 - 09:13 #42
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å.
Avatar billede arne_v Ekspert
28. maj 2005 - 16:40 #43
skal vi have afsluttet her ?

og et svar fra mig

husk at bede burningice om et også
Avatar billede burningice Nybegynder
28. maj 2005 - 16:55 #44
lægger da lige et, for en sikkerheds skyld
Avatar billede arne_v Ekspert
24. juli 2005 - 17:16 #45
lucifers ??
Avatar billede lucifers Nybegynder
24. juli 2005 - 17:43 #46
Hov, min fejl at jeg ikke fik svaret.
burningice:
Har du et kodeeksempel på det, du skriver i 11/05-2005 23:23:47?
Avatar billede burningice Nybegynder
23. august 2005 - 16:24 #47
lidt psuodo-kode

en bruger går i edit-mode:

string id-der-repræsenterer-dine-data = //noget

if (!(bool)Application[id-der-repræsenterer-dine-data]) {

  Application[id-der-repræsenterer-dine-data] = true //dette indikerer at data'erne bliver redigeret

  //Rediger data
} else {
  // De ønskede data er ved at blive redigeret
}


Når brugeren så gemmer data'erne

string id-der-repræsenterer-dine-data = //Noget

//Gem data i db

Application[id-der-repræsenterer-dine-data] = false;
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
Kurser inden for grundlæggende programmering

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

IT-JOB

Økonomistyrelsen

Product Owner til RejsUd

Rambøll Management Consulting

Senior Software Engineer

Netcompany A/S

Network Engineer

Politiets Efterretningstjeneste

Datacentertekniker til PET