Avatar billede skwat Praktikant
26. oktober 2005 - 10:19 Der er 7 kommentarer og
1 løsning

SQL server fejl ved mange updates

Hej E#,

Jeg har et program som står og modtager nogle data og ud fra informationerne her skal opdatere nogle poster i en MsSQL tabel.

Det funger i sig selv meget godt, men nu er der sket det at mængden af poster der bliver opdateret er steget voldsomt.

Additional information: System error. (System.Data.SqlClient.SqlException)

Koden hvor jeg laver opdateringerne er:

foreach (int id in evts)
{
    com.Parameters.Clear();
    com.Parameters.Add("@cbid", SqlDbType.Int).Value = fileid;
    com.Parameters.Add("@uid", SqlDbType.Int).Value = id;
    com.ExecuteNonQuery();
}

@cbid er det felt der bliver opdateret, og @uid er det unikke id på tabellen.

Jeg har forsøgt mig med en System.Threading.Thread.Sleep(); inde i løkken, hvilket løser problemet, men det syntes jeg ikke er optimalt.

Nogen der har en ide til hvad jeg kan gøre?
Avatar billede faedros Nybegynder
28. oktober 2005 - 09:54 #1
Har du prøvet at lægge opdateringerne ind i en samlet transaktion?
Avatar billede skwat Praktikant
30. oktober 2005 - 23:47 #2
Ja, det har jeg, og det virker også, men det belaster sql serveren meget voldsomt.

Jeg håbede lidt på at der fantes en .WaitUntilServerIsReady(timeout) eller noget i den dur.
Avatar billede faedros Nybegynder
31. oktober 2005 - 09:12 #3
Jeg går ud fra, at dit com objekt er af typen SqlCommand. I dokumentationen for ExecuteNonQuery på den står, at SqlException kastes, nåt 'An exception occurred while executing the command against a locked row'.

Så kunne det tænkes at problemet skyldes at du har flere opdateringer til samme uid umiddelbart efter hinanden? Så kunne man forestille sig at opdateringerne håndteres af forskellige tråde i SQL Serveren, og at de kommer i vejen for hinanden.

En løsning kunne i så fald være at løben din evts collection igennem og fjerne dobbelt-opdateringer af samme uid (hvis det er OK).

Har du meddelelsesteksten i den exception, du får? Og kan du af den se, om det er et locking-problem?
Avatar billede skwat Praktikant
31. oktober 2005 - 11:21 #4
Jeg tror du har halt ret i SQL server og håndteringen, men der er netop kun et UID, min collection er på forhånd blevet trimmet for dobbelte opdateringer.

Det er lidt sjovt med denne exception, der er ikke mere information end det jeg har givet, ingen stacktrace, og meddelelsesteksten er netop "System error".
Avatar billede faedros Nybegynder
31. oktober 2005 - 13:06 #5
OK, jeg tror vi er på rette spor. SQL låser som udgangspunkt en side (page) ad gangen. En page er 8K, så hvis du har en smal tabel, kan det svare til ganske mange rækker.

Du kan forsøge med at ændre låsestrategi ved at specificere at din update skal ske med RowLock:

update MyTable with (rowlock)
set <whatever>
where <whatever>

NB! Hvis du prøver dette, skal du lige være opmærksom på memory forbruget i din SQL server - rowlocking bruger noget mere memory end pagelocking.
Avatar billede skwat Praktikant
02. november 2005 - 13:33 #6
Fejl er ikke opstået i et par dage nu, dog har mængden af updates ikke været så stor, men jeg tror og håber på det er løst.

Smid et svar.
Avatar billede faedros Nybegynder
02. november 2005 - 15:56 #7
Svar *smidt*
Avatar billede skwat Praktikant
03. november 2005 - 01:02 #8
Jeg syntes i øvrigt det er svært at finde noget i onlinebooks omkring emnet, 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