Du har godt nok pakket din sp ind i en navngiven transaktion, men din select og beregning sker før din update. Dvs. du læse på et tidspunkt hvor du har en læse-lås (share) på rækken, først senere får du en skrive (eksklusiv) lås.
Dermed *kan* to samtidige opdateringer kolidere. Du bør angive et låsehint i din select så du får en eksklusiv lås.
En anden mulighed er, at du summer hele dit statement op i updaten, så du ikke har en separat select.
begin transaction update mytable set val = val + 1 where name = 'NextProfileId' select @a = val from mytable where name = 'NextProfileId' commit transaction
UPDATE SystemVariables SET Val = convert(Text, convert(numeric, Val) + 1) WHERE Name = 'CurrentProfileId' SELECT @NextProfileId = convert(numeric, Val) FROM SystemVariables WHERE Name = 'CurrentProfileId'
IF @@Error <> 0 OR @@ROWCOUNT <> 1 BEGIN SET @Error = 1 END
IF @Error = 0 BEGIN COMMIT TRANSACTION NextProfileId END ELSE BEGIN ROLLBACK TRANSACTION NextProfileId SET @NextProfileId = 0 END GO
Da Val er Text, hvorledes skal min convertion se ud?
Ok, så burde din conversion som ovenfor være ok blot du retter "text" til "varchar". Ellers bruger jeg ofte CAST() men i praksis er der vist ingen forskel.
UPDATE SystemVariables SET Val = convert(numeric, Val) + 1 WHERE Name = 'CurrentProfileId'
Jeg behøver ikke at converte tilbage.
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.