Avatar billede segato Nybegynder
30. juni 2005 - 20:59 Der er 11 kommentarer og
1 løsning

Lock en database!

Skal lave en system ala Visual Sourcesafe hvor man kan sætte en state i en database om en bruger anvender en given ting (readonly). Men hvis readonly er sat til falsk og to brugere samtidig tilgår denne værdi går mit scenario jo lidt i vasken. Hvad er den smarteste måde at lave sådan løsninger på? Overvejde om man skulle låse tabellen(og hvordan gør man det?) eller er der andre endnu bedre metoder?
Avatar billede arne_v Ekspert
30. juni 2005 - 21:08 #1
du kan bruge en database specifik kommando til at låse tabellen

eller du kan lave query og update i en transaktion efter at have sat
transaction isolation level til serializable
Avatar billede segato Nybegynder
01. juli 2005 - 10:02 #2
Kan du give eksempler på hvordan man gør Arne?
Avatar billede segato Nybegynder
01. juli 2005 - 10:06 #3
Og hvad sker der egentlig hvis man locker en database og noget går galt? Er den så locked for evah. Og hvad sker der når man prøver at tilgå en locked tabel? Får man så en exception via ado.net eller venter den bare lidt med at prøve igen?
Avatar billede arne_v Ekspert
01. juli 2005 - 12:02 #4
eksempel på tabel låsning ? (til hvilken database ?)

eller eksempel på transaction ?
Avatar billede segato Nybegynder
01. juli 2005 - 12:46 #5
Det mere sådan en genrel forståelse jeg søger. Jeg har gjort følgende:

    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
    BEGIN TRANSACTION

    DECLARE @count INT
    set @count = (select count(*) from checkout_table with(ROWLOCK) where id=4)

    IF( @count < 1 )
    begin
        insert into news_checkout values(@id,@user,getDate())
        select 1       
    end
    ELSE   
    begin
        select 0               
    end

    COMMIT TRANSACTION

Betyder det her at hvis en bruger kalder den her SP kan andre så ikke checke noget ind mend den kører. Hvad sker der hvis to brugere på nøjagtig samme tid kalder den her funktionalitet?
Avatar billede segato Nybegynder
01. juli 2005 - 12:46 #6
news_checkout = checkout_table
Avatar billede arne_v Ekspert
01. juli 2005 - 13:24 #7
du behøver ikke:
  with(ROWLOCK)

(om det giver en performance fordel skal jeg ikke gøre mig klog på)
Avatar billede arne_v Ekspert
01. juli 2005 - 13:24 #8
der er altid en som kommer først
Avatar billede arne_v Ekspert
01. juli 2005 - 13:26 #9
TRANSACTION ISOLATION LEVEL SERIALIZABLE

sikrer at en SELECT vil returnere det samme gennem hele transaktionen
Avatar billede segato Nybegynder
01. juli 2005 - 13:33 #10
Jeg vil prøve at stres teste det lidt. Jeg har stadig ik fået helt fat i hvis jeg kalder transaktionen og du lige efter kalder den, skal du så vente til jeg er færdig med tabellerne fordi transaktionen måske forhindre andre i at bruge tabellerne eller kan jeg faktisk riskere at du når at læse den her linie:

set @count = (select count(*) from checkout_table with(ROWLOCK) where id=4)

inden jeg når at få smidt en række ind?

Smid et svar lige meget om du kan svare på ovenstående var det brugbar info.
Avatar billede arne_v Ekspert
01. juli 2005 - 13:34 #11
ja den bliver låst

sådan kort fortalt betyder serializable at selv ved kørsel af 2 samtidigt skal
man få samme resultat som hvis de var serialiseret d.v.s. at nummer to først
startede når nummer 1 er færdig

og svar
Avatar billede segato Nybegynder
01. juli 2005 - 14:19 #12
Og det jo det jeg skulle nå frem til. Tak for hjælpen:D
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