/ Forside / Teknologi / Udvikling / ASP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
ASP
#NavnPoint
smorch 9259
Harlekin 1866
molokyle 1040
Steffanst.. 758
gandalf 657
smilly 564
gibson 560
cumano 530
MouseKeep.. 480
10  Random 410
Låsning af record
Fra : Betina Andersen


Dato : 27-07-06 10:22

Jeg skal åbne en record for at tælle et felt 1 op, det som er vigtigt er at
tabellen åbnes låst så feltet ikke bliver opdateret fra et andet sted fra.
Jeg kan ikke finde ud af hvilke typer jeg skal sætte på min rs.Open for at
sikre dette, nogen der ved hvordan?

Eks.

rs.Open sql, xx,xx
rs.Edit
rs("Felt") = rs("felt") + 1
rs.Update

mvh Betina



 
 
Jens Gyldenkærne Cla~ (27-07-2006)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 27-07-06 11:27

Betina Andersen skrev:

> Jeg skal åbne en record for at tælle et felt 1 op, det som er
> vigtigt er at tabellen åbnes låst så feltet ikke bliver
> opdateret fra et andet sted fra.

Hvis du i stedet for at åbne tabellen opdaterer den direkte med en
forespørgsel, behøver du ikke bekymre dig om andre opdateringer:


   strSQL = "UPDATE tabel SET felt = felt + 1 WHERE id = 42"
   
   Conn.Execute strSQL

Selv om flere sessioner kører forespørgslen samtidig, vil databasen
sørge for at alle bliver behandlet korrekt.

Det virker dog kun så længe du ikke har flere afhængige
forespørgsler. Hvis du fx efter ovenstående vil foretage en select
for at se den nye værdi - og det er vigtigt at det er den værdi som
netop denne forespørgsel har sat, kan du ikke klare dig med en
simpel opdateringsforespørgsel. Her kan du bruge
Application.Lock/Unlock for at forhindre mere end én transaktion i
at køre.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Betina Andersen (27-07-2006)
Kommentar
Fra : Betina Andersen


Dato : 27-07-06 11:40

"Jens Gyldenkærne Clausen" <jens@gyros.invalid> skrev i en meddelelse
news:Xns980D7E9E657BDjcdmfdk@gyrosmod.dtext.news.tele.dk...
>
> Det virker dog kun så længe du ikke har flere afhængige
> forespørgsler. Hvis du fx efter ovenstående vil foretage en select
> for at se den nye værdi - og det er vigtigt at det er den værdi som
> netop denne forespørgsel har sat, kan du ikke klare dig med en
> simpel opdateringsforespørgsel. Her kan du bruge
> Application.Lock/Unlock for at forhindre mere end én transaktion i
> at køre.

Det skulle jeg måske have skrevet i mit indlæg for ja jeg skal jo netop
bruge værdien så derfor ville jeg gøre det på den anden måde med
låsetyperne sat på. Jeg tør ikke låse for at applikationen ikke må lave
forespørgsler mens jeg laver dette nummer da der kan være mange brugere på.

mvh Betina



Jens Gyldenkærne Cla~ (27-07-2006)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 27-07-06 12:52

Betina Andersen skrev:

> Det skulle jeg måske have skrevet i mit indlæg for ja jeg skal
> jo netop bruge værdien så derfor ville jeg gøre det på den
> anden måde med låsetyperne sat på.

Hvilken database benytter du? Hvis databasen understøtter lagrede
procedurer, kan du lade den klare arbejdet (lav en procedure der
opdaterer tabellen og returnerer den nye værdi).

I to af de ofte anvendte databaser - Access og MySQL 4 - kan det
dog ikke lade sig gøre. Her kan du i stedet gøre noget a la:


strUpdate = "UPDATE tabel SET felt = felt + 1 WHERE id = " & id
strSelect = "SELECT felt FROM tabel WHERE id = " & id

Application.Lock
   Conn.Execute (strUpdate)
   Set rs = Conn.Execute (strSelect)
Application.Unlock


> Jeg tør ikke låse for at applikationen ikke må lave forespørgsler
> mens jeg laver dette nummer da der kan være mange brugere på.

Med ovenstående model bliver der kun låst i den tid det tager at
fyre to forespørgsler af sted. Jeg tror ikke det vil betyde
mærkbare forsinkelser for brugerne.

Man skal sørge for at låse i så kort tid som muligt - derfor skal
oprettelsen og nedlæggelsen af forbindelsen fx ligge uden for
låsen.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Betina Andersen (27-07-2006)
Kommentar
Fra : Betina Andersen


Dato : 27-07-06 13:58

"Jens Gyldenkærne Clausen" <jens@gyros.invalid> skrev i en meddelelse
news:Xns980D8D1EBF893jcdmfdk@gyrosmod.dtext.news.tele.dk...
> Hvilken database benytter du? Hvis databasen understøtter lagrede
> procedurer, kan du lade den klare arbejdet (lav en procedure der
> opdaterer tabellen og returnerer den nye værdi).
Jeg bruger SQL Server men det med stored procedures er ikke lige mig

> Application.Lock
> Conn.Execute (strUpdate)
> Set rs = Conn.Execute (strSelect)
> Application.Unlock
>
Det er en rutine som vi kalder tit så jeg ved stadig ikke...jeg tror den
ryger i tankeboks, men hvis jeg gør ovenstående, vil det så ikke være smart
at lave en On error som også laver Application.Unlock i tilfælde af at noget
går galt under udførelsen af sætningen, da jeg ellers formoder hele
webapplikationen ellers vil være låst?

mvh Betina



Jens Gyldenkærne Cla~ (27-07-2006)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 27-07-06 15:10

Betina Andersen skrev:

> Jeg bruger SQL Server men det med stored procedures er ikke
> lige mig

Det er bare med at komme i gang. SP'er er både mere effektive og
mere sikre end rå sql-kode.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Michael Weber (27-07-2006)
Kommentar
Fra : Michael Weber


Dato : 27-07-06 21:52


"Betina Andersen" <byl@egdatainform.invalid> skrev i en meddelelse
news:44c885de$0$827$edfadb0f@dread12.news.tele.dk...
> Jeg skal åbne en record for at tælle et felt 1 op, det som er vigtigt er
at
> tabellen åbnes låst så feltet ikke bliver opdateret fra et andet sted fra.
> Jeg kan ikke finde ud af hvilke typer jeg skal sætte på min rs.Open for at
> sikre dette, nogen der ved hvordan?
>
> Eks.
>
> rs.Open sql, xx,xx
> rs.Edit
> rs("Felt") = rs("felt") + 1
> rs.Update
>
> mvh Betina
>
>

http://www.w3schools.com/ado/prop_rs_locktype.asp
rs.LockType = adLockPessimistic


Fra SQL Server Book Online (SQL 2K server) :

ADO applications :
Specify adLockReadOnly, adLockPessimistic, adLockOptimistic, or
adLockBatchOptimistic in the LockType property of a Recordset object.

Kig i manualen for din version af server, for at se hvilke typer af lås den
understøtter,
omend det nok er de samme.

Med venlig hilsen
Michael Weber











Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408520
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste