02. november 2004 - 18:18Der er
17 kommentarer og 1 løsning
Transaktioner i java.
Hej Eksperter. Vi har opfundet vores eget framework og lige nu er vi ved at kigge den måde hvorpå vi hånterer transaktioner igennem i sømmene. Programmet skal kunne håntere flere brugere.
Til at tilgå databasen bruger vi: java.sql.Connection java.sql.PreparedStatement
Hvis man skal rette i nogle oplysninger selecter vi en række fra en tabel. Så kan man ellers rette løs på sit skærmbillede. Når man så er færdig med at rette og vil gemme selecter vi den samme række ud igen og tjekker om et tidsfælt er blevet ændret siden sidst, hvis det er det er der en bruger der har ændret rækken siden vi selv selectede den ud.
Problemet er bare at hvis to brugere trykker på gem på nøjagtig samme tid så kan det ske at den select vi laver før vi gemmer bliver gjort på samme tid og derfor vil vi ikke kunne se at tidsfeltet er ændret af en anden bruger og sidst til mølle får så malet da sidste update overskriver den første. Det vi godt kunne tænke os er at når vi laver den select lige før der tjekkes på tiden og der gemmes at den så kan låse rækken så andre ikke kan læse den. Kan man styre det på en smart måde?
Når du sætter transaction isolation level serializable så vil alle transaktioner foregå som om de var serialiserede altså at den næste først startede når den nuværende var færdig.
Det er sådan set databasens problem hhvordan den vil opnå effekten.
I praksis sker der nok det at databasen putter en LOCK på den row du SELECT'er. Den LOCK bliver så frigjordt ved COMMIT. Og den anden transaktion står derfor og venter på at få LOCK indtil den første har COMMIT'et.
Vi sætter setAutoCommit(false) for at den ikke skal autocommitte.. Når vi så er færdige med at update committer vi. Begin bruger vi ikke så jeg vil tro det sker automatisk.
Det jeg har brug for er en måde hvorpå jeg kan låse rækken så andre der vil læse den for senere at update den ikke vil kunne læse den før den første der har læst den har committet den.
Dvs. først select for at vise det til brugeren skal ikke låse rækken anden select der bruges for at hente rækken fra tabellen den skal låse rækken så andre ikke kan selecte den før der er committet.
hmm men hvordan ved den om jeg vil læse for at ændre eller læse for bare at læse? Så skal jeg sætte transaction isolation level hver gang alt efter hvad jeg skal bruge min connection til?
Jeg valgte at løse problemet ved at huske det jeg havde selectet ud og så bruge det i min where sætning. Men tak for foreslagene.
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.