Avatar billede jytte Nybegynder
22. september 2005 - 10:33 Der er 8 kommentarer og
1 løsning

Hjælp til stored procedure

Jeg har noget jeg gerne vil have udført udeleligt i databasen, men som består af flere sql-sætninger.

I pseudokode er det noget i retningen af

Begin Trans
  s=select top 1 sessionid from ledige where brugt=0
  update ledige set brugt=1 and tidspunkt=datetime where
  sessionid=s
  returner s
End Trans

Det er altså en slags (udelelig) reserveringsfunktion

Kan man lave dette som en stored procedure og i givet fald hvordan?
(obs: jeg er totalt nybegynder i stored procedures)
Avatar billede claesdamlund Nybegynder
22. september 2005 - 13:36 #1
Måske noget i stil med:

Hvorfor ikke bare en "udelelig" opdatering:

UPDATE ledige
SET brugt=1
WHERE sessionid IN (
  SELECT TOP 1 sessionid
  FROM ledige
  WHERE brugt = 0
  ORDER BY et_eller_andet)

Det returnerer godt nok ikke din sessionid...
Husk at du kun kan bruge TOP i kombination med en ORDER BY - i hvert fald hvis den skal give mening.
Avatar billede claesdamlund Nybegynder
22. september 2005 - 13:37 #2
Glem "Måske noget i stil med:" - havde ikke lige fået slettet den linie.
Avatar billede claesdamlund Nybegynder
22. september 2005 - 13:49 #3
Eller som Stored Procedure:

CREATE PROCEDURE procedurenavn
AS
DECLARE @s AS Int

BEGIN TRANSACTION
  SELECT TOP 1 @s=sessionid
    FROM ledige
    WHERE brugt = 0
    ORDER BY et_eller_andet

  UPDATE ledige
  SET brugt=1
  WHERE sessionid = @s

  RETURN @s
COMMIT TRANSACTION
Avatar billede trer Nybegynder
22. september 2005 - 16:45 #4
Hej Claus og Jytte

Proceduren fungerer ikke helt som I sikkert forventer.

Select'en kommer før updaten, så låsen laves som en sharelås ikke en update lås. Dermed er det ikke en udelelig transaktion selvom der er en explicit transaktion udenom.

der skal tilføjes WITH(UPDLOCK) til select'en for at du får den ønskede effekt.

a ka

SELECT TOP 1 @s=sessionid
    FROM ledige WITH(UPDLOCK)
    WHERE brugt = 0
    ORDER BY et_eller_andet

mvh
Troels
Avatar billede jytte Nybegynder
23. september 2005 - 17:34 #5
Mange tak for jeres indlæg -- nu ved jeg meget mere om stored procedures

Jeg valgt dog en lidt anden løsning (men bruger stored procedures) da en låsning ville gå lidt for meget ud over performance da der skal være mange samtidig brugere.

Jeg håber I begge  vil lægge et svar så I kan deles om pointene
Avatar billede claesdamlund Nybegynder
23. september 2005 - 18:11 #6
Svar - men trer fortjener mindst halvdelen (hans pointe havde jeg overset)
Avatar billede claesdamlund Nybegynder
23. september 2005 - 18:12 #7
Sender det også lige som svar...
Avatar billede trer Nybegynder
24. september 2005 - 17:11 #8
Lad Claus få points'ne - det var blot en lille detalje.

mvh
Troels
Avatar billede jytte Nybegynder
25. september 2005 - 15:54 #9
>trer:  en lille men vigtig detalje som jeg har bidt mærke i.
Jeg bøjer mig dog for dit ønske og giver claesdamlund alle point
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
Computerworld tilbyder specialiserede kurser i database-management

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