Avatar billede Slettet bruger
12. november 2003 - 19:43 Der er 24 kommentarer og
1 løsning

Java over netværk mod en MySql

Hej,

Jeg skal i gang med at lave et GUI flere-bruger program som skal køre over netværk op imod en database (MySQL).
Mit spørgsmål lyder på hvordan jeg skal lave det sådan at når en bruger har "åbnet" en post fra db'en, så skal de andre bruger ikke kunne skrive til den samme post, de skal kun have lov til at læse, altså read-only.

Jeg har aldrig prøvet at lave den slags før og jeg aner overhovedet ikke hvor jeg skal starte og hvor jeg skal slutte :-(
Avatar billede arne_v Ekspert
12. november 2003 - 19:50 #1
Prøv med:

SELECT ... FOR UPDATE;
Avatar billede Slettet bruger
12. november 2003 - 19:51 #2
æaeh, hvad gør den ??
Avatar billede arne_v Ekspert
12. november 2003 - 19:52 #3
Iøvrigt løses problemet normalt via version pattern, hvor den
sidste der skal gemme får en fejl.
Avatar billede arne_v Ekspert
12. november 2003 - 19:53 #4
Den låser det man SELECT'er. Således at andre ikke kan UPDATE'e de records.
Avatar billede arne_v Ekspert
12. november 2003 - 19:54 #5
Spørgsmålet er om det virker med MyISAM tabeller eller kræver InnoDB.
Avatar billede arne_v Ekspert
12. november 2003 - 19:54 #6
LOCK TABLES virker selvfølgelig men det er jo at tage kartofler op
med en bulldozer.
Avatar billede Slettet bruger
12. november 2003 - 20:12 #7
Okay, det skal afprøves, hvis det virker så er det en ret nem løsning :-)
Avatar billede arne_v Ekspert
12. november 2003 - 20:21 #8
Lidt søgning på nettet har overbevist mig om at SELECT FOR UPDATE kræver
InnoDB.

Så vær opmærksom på det.
Avatar billede Slettet bruger
12. november 2003 - 21:57 #9
Jeg må selv lave lidt research så, jeg aner nemlig ikke hvad InnoDB er
Avatar billede arne_v Ekspert
12. november 2003 - 22:00 #10
MySQL understøtter flere forskellige typer af tabeller.

De to mest almindelige er MyISAM og InnoDB.

InnoDB understøtter transactions.

MyISAM er default.
Avatar billede Slettet bruger
12. november 2003 - 22:00 #11
Argh, så skal jeg få den til at bruge InnoDB.
Jeg har vist ret meget at lære endnu :-)
Avatar billede arne_v Ekspert
12. november 2003 - 22:04 #12
Avatar billede Slettet bruger
12. november 2003 - 22:10 #13
Hvis jeg forstår det ret så kan jeg bare oprette mine tabeller i InnoDB og så kan jeg bruge Select ... Update??
HVordan frigør jeg så en post ?
Avatar billede arne_v Ekspert
12. november 2003 - 22:12 #14
Når du laver din UPDATE (eller hvis transaktionen afsluttes).
Avatar billede Slettet bruger
12. november 2003 - 22:14 #15
Det kan være at jeg ikke har udtrykt mig klart nok.
Jeg skal have lavet er retur-system til mit arbejde. Der problemmet opstår er hvis bruger2 åbner det journal-nr som en bruger1 sidder og retter i, så skal bruger2 ikke have mulighed for at skrive men kun læse. Men bruger1 kan jo sagtens have det journal-nr åben i længere tid af gangen
Avatar billede arne_v Ekspert
12. november 2003 - 22:55 #16
SELECT FOR UPDATE løser problemet.

Det er lidt hårdt ved databasen at have langvarige transaktioner.

Og så er vi tilbage ved version pattern.
Avatar billede Slettet bruger
12. november 2003 - 22:56 #17
Godt så skal jeg bare have lidt at vide om version pattern, evt. hvor jeg måske kan læse lidt mere om det - hvis det ikke er til for stor ulejlighed
Avatar billede arne_v Ekspert
12. november 2003 - 23:00 #18
Recorden har et versions nummer som hentes med ud når man laver SELECT
(det vises selvfølgelig ikke).

Når man så skal gemme sine rettelser så laver man en logik som:

transaktion {
  SELECT version FROM tabel
  if minversion < version {
      rollback transaktion
      informer bruger om at en anden har rettet
  } else {
      UPDATE tabel SET felt=værdi, version=minversion+1
      commit transaktion
  }
}
Avatar billede arne_v Ekspert
12. november 2003 - 23:00 #19
Bemærk det er ikke helt samme logik. Men en løsning på problemet.

Hvis du vil låse, seå er SELECT FOT UPDATE svaret.
Avatar billede Slettet bruger
12. november 2003 - 23:06 #20
Den tror jeg nok at jeg har fattet :-)
Det er en ret simpel løsning, men den løser jo problemmet!

Lig lige et svar, så du kan få dine point
Avatar billede arne_v Ekspert
12. november 2003 - 23:07 #21
svar
Avatar billede arne_v Ekspert
12. november 2003 - 23:07 #22
Det er svært at finde noget godt om version pattern.

Det eneste jeg kan finde er:
  http://www.theserverside.com/patterns/thread.jsp?thread_id=13199
Avatar billede Slettet bruger
12. november 2003 - 23:13 #23
Det vil jeg kigge lidt mere på.
Jeg har oxo en anden løsning i tankerne. Når bruger1 henter en post, kan man have et felt som man sætter til 1, hvilket så betyder at hvis en anden bruger forsøger  at hente fra samme post og programmet detektere at det felt er sat til 1, får de en besked om at en anden bruger arbejder på den post. Når de så forlader den post så bliver feltet sat til 0 og det er så klart til næste bruger.

Jeg kan umiddelbart se 2 fælder:
1) En bruger lader sin maskine stå på det journal-nr fra morgen til aften
2) En bruger lukker programmet forkert, f.eks. ved at pille stikket ud af maskinen
Avatar billede arne_v Ekspert
12. november 2003 - 23:17 #24
Jep. Du er ikke den første med den ide.

De 2 andre løsninger har ikke det problem. SELECT FOR UPDATE fordi
transaktionen forsvinder med connection. Version fordi den vender problem
stillingen om.
Avatar billede Slettet bruger
12. november 2003 - 23:34 #25
Det har du ret i, men samtidig er der den problem-stilling at hvis brugeren har lavet en masser rettelser og imens er der en anden bruger der har lavet en lille rettelse har vi problemmet. En af dem mister info.
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