Avatar billede spottie Nybegynder
09. marts 2006 - 18:00 Der er 4 kommentarer og
1 løsning

Hjælp til at kun 1 person kan arbejde i database af gangen?

Goddag Eksperter

Jeg har et program der er lavet i C# 2003 .NET, som er en Windows Applikation med en tilhørende mysql databse, men en ting jeg søger hjælp og kodehjælp til er følgende:

1) Hvis nu der er 2 personer der retter i den samme ting i databasen kan det så give problemer?

2) Kan man i C# 2003 .NET lave et stykke kode der gør at hvis en person er aktik i databasen, så får den eller de andre personer der forsøger at arbejde i den sanne tabel, felt eller lign i databsen en fejl meddelse i C# om at vente lidt?

Kan dette lade sig gøre og hvis ja, hvordan? gerne med lidt kode.

Vh spottie
Avatar billede casualty Nybegynder
09. marts 2006 - 19:16 #1
Jeg  tror ikke at der er noget i .Net der kan klare det for dig. Du bliver nok nødt til at løse det programmatisk, i et samarbejde mellem .Net og MySql.

1. Du kan selecte "for update" så rækken bliver låst indtil du opdaterer
(se http://dev.mysql.com/doc/refman/5.0/en/select.html)

2. du kan oprette en kolonne i de enkelte tabeller der indikerer hvorvidt nogle andre arbejder med den enkelte row. Derefter selecter du kun fra de rows der ikke er låste...

Mvh Casualty
Avatar billede casualty Nybegynder
09. marts 2006 - 19:21 #2
Det er et klassisk samtidighedsproblem i databasedesign.

Når du vælger den løsning at låse, kaldes det pessimistic lock.
Pessimistisk fordi at vi altid går ud fra at der vil blive rettet i de samme rækker og derfor vil undgå det.

Du kan også vælge optimistic lock. Det vil sige at alle kan selecte og et timestamp hentes med op fra hver enkelt row. Timestamp angiver hvornår rækken sidst blev ændret.

Når man så gemmer, tjekker man om rækkens timestamp er det samme som det men prøver at gemme. Hvis ikke, er der nogen der har gemt i mellemtiden, og konflikten tages derfra. Optimistisk fordi at vi går ud fra det sjældent vil ske...

Mvh Casualty
Avatar billede arne_v Ekspert
09. marts 2006 - 19:39 #3
Meget afhaenger af hvilken slags samtidighed du taenker paa.

Mener du:
  - bruger A laver nogle SQL statements
  - bruger B laver nogle SQL statements
  - de koerer parallelt i et antal millisekunder
eller:
  - bruger A laver nogle SELECT for at hente data, retter i data og gemmer via en UPDATE
  - bruger B laver nogle SELECT for at hente data, retter i data og gemmer via en UPDATE
  - de koerer parallelt i et antal minutter

Det foerste kan normalt loeses med de indbyggede locking mekanismer i databasen.

Du kan bruge transactions og et passende hoejt transaction isolation level.

Eller man kan bruge SELECT FOR UPDATE.

Det andet vil normalt kraeve noget kode.

Enten en pessimistisk eller en optimistisk locking som beskrevet af casualty.

Husk at overveje situationen hvor brugere bestemmer sig for ikke at gemme
deres rettelser.
Avatar billede skov_p Praktikant
12. marts 2006 - 15:45 #4
Hvis du laver en klasse der håndtere alt kommunikation med databasen kan du låse den så ikke to brugere kan bruge den samtidig.
med lock() metoden

public void update_database(string sqlStr){
  lock(this){
    Opdater noget i databasen her
  }
}

så snart at den ene bruger er inden for lock paranteserne vil den anden brugen "vente" på at dan første er færdig.
Avatar billede skov_p Praktikant
12. marts 2006 - 15:47 #5
Lidt nærmere info.
Hvis du bruger lock(this) "låses" hele klassen.
Der er ikke kun i relation til database forbindelse men kan bruges i andre sammenhæng. (har bare ikke selv brugt den i andre sammenhæng)
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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