Avatar billede mach3 Nybegynder
14. januar 2005 - 20:53 Der er 9 kommentarer og
1 løsning

semaforer med c#?

hej,

jeg har to linjer kode som er kritiske at de bliver udført lige efterfølgende.

det drejer sig om at jeg indsætter i databasen og lige efterfølgende skal jeg se hvilken id det indsatte har fået i databasen. så jeg henter max id'en ud efterfølgende.

#1 indæt i databasen
#2 hent max id ud fra databasen

men i kan godt se problemet, ikke? hvis der mellem trin #1 og #2 bliver indsat noget andet i databasen, så vil der gå kuk i hvilken id der hører til hvad.

kan man ikke lave et eller andet med beskyttelse af kritiske regioner i c#? eller kan det løses på en anden måde? eller er chancerne for at det sker så små at det bare skal ignoreres?

det er ikke fordi der er total mange brugere på ad gangen, men det kunne være meget godt at gardere sig i mod :-)

mvh
Avatar billede arne_v Ekspert
14. januar 2005 - 20:57 #1
lock(objekt)
{
    ...
}
Avatar billede arne_v Ekspert
14. januar 2005 - 20:58 #2
Så vil ... kun kunne udføres 1 en gang samtidigt (for samme objekt der lockes på).
Avatar billede arne_v Ekspert
14. januar 2005 - 20:59 #3
Og det er den forkerte måde at løse problemet på !

Lav indsæt og fisk den auto genererede id ud uden en SELECT MAX(ID) FROM tabelnavn.

Access + SQLServer:

SELECT @@IDENTITY

MySQL:

SELECT LAST_INSERT_ID()
Avatar billede mach3 Nybegynder
14. januar 2005 - 21:07 #4
ok det er stort det der arne_v

svar :o)
Avatar billede arne_v Ekspert
14. januar 2005 - 21:08 #5
svar
Avatar billede arne_v Ekspert
14. januar 2005 - 21:09 #6
for samme objekt der lockes på => ofte vil man bruge et static field
Avatar billede mach3 Nybegynder
14. januar 2005 - 21:11 #7
det er den med SELECT @@IDENTITY som jeg skal anvende - det er bedre til denne situation som jeg har forstået det :-)
Avatar billede arne_v Ekspert
14. januar 2005 - 21:14 #8
Ja.

Den henter den sidste auto genererede id for din connection og belaster
applikation/database mindst muligt.
Avatar billede arne_v Ekspert
14. januar 2005 - 21:15 #9
Hvis du SQLServer guru og hygger dig med triggers, så bør du iøvrigt bruge:

SELECT SCOPE_IDENTITY()
Avatar billede mach3 Nybegynder
14. januar 2005 - 21:21 #10
ok tak for det. det vil jeg kigge på senere - skal lige have nogle andre ting op og køre først! men tak for hjælpen!
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