Avatar billede crysis Nybegynder
11. april 2006 - 11:03 Der er 7 kommentarer

Optimistic concurrency check.

Jeg har et større site med temmelig meget trafik. Sitet ligger på en webserver(ASP) og så en 3-4 SQLservere.

Problemet er at jeg får en del "Optimistic concurrency check failed. The row was modified outside of this cursor." på forskellige sider. Nogle mere end andre. Jeg har prøvet at ændre LockType frem og tilbage, men ser ikke ud til at hjælpe.

Er der nogen der ved om det har noget med måden det er sat op (distribuering mellem SQL serverne)?

Data'erne bliver hentet og håndteret via ADO.
Avatar billede ldanielsen Nybegynder
11. april 2006 - 12:25 #1
Du skal nok se på CursorLocation of CursorType i stedet.

Ved hvilke kommandoer optræder fejlen? Kan jeg set et kodeeksempel?
Avatar billede crysis Nybegynder
11. april 2006 - 12:32 #2
Ja, dem har jeg også kigget på. Her er lidt kode. IIS melder fejl ved rsViews.update:

rsViews.Source = "SELECT TOP 1 *  FROM Views WHERE ContactId = " + Replace(rsViews__parContactId, "'", "''") + ""
rsViews.CursorType = 0
rsViews.CursorLocation = 2
rsViews.LockType = 3

Tabellen Views er temmelig stor og der bliver tilføjet records konstant.
Avatar billede ldanielsen Nybegynder
11. april 2006 - 12:52 #3
Har du et problem med at der er flere der rettet data samtidig? Hvis ikke vil jeg bruge rsViews.CursorLocation = 3

Den siger at cursoren ligger hos klienten, så en updat vil overskrive det der i mellemtiden er sket på serveren
Avatar billede crysis Nybegynder
11. april 2006 - 13:02 #4
rsViews er en tæller over visninger, så den må ikke overskrive med "gammel" data. Den skal bare åbne tabellen, låse den, opdatere den og så videre.

Kan problemet være at jeg benytte laver en SELECT for at få ADO recordset og så bruger .addnew og update? Måske jeg skulle lave en INSERT/UPDATE sætning i stedet.
Avatar billede ldanielsen Nybegynder
11. april 2006 - 13:23 #5
Ved du hvad, jeg tager fejl:

CursorLocation 3 (adUseClient) betyder at data ligger hos klienten, dvs. at ingen andre kan ændre dem indtil de er opdaterede.

LockType 3 sikrer at data ikke er readonly, og så kan du opdatere.

Alt der sker mellem Con.Open og Con.Close sker i en transaction, dvs. at ingen andre brugere kan pille ved data imens. Med mindre du selv laver noget transactionstyring.

Derfor skulle det virke med:
rsViews.CursorType = 0
rsViews.CursorLocation = 3
rsViews.LockType = 3

Microsoft skriver dog om en bug der giver denne fejl (http://support.microsoft.com/default.aspx?scid=kb%3Ben-us%3B158164), og workaround skulle være at bruge en CursorType 1 i stedet (adOpenKeyset)
Avatar billede crysis Nybegynder
11. april 2006 - 13:38 #6
Ja, har godt læst om den bug. Det ser ud til at virke indtil videre. Nu kommer der dog enkelte fejl af: "Row cannot be located for updating. Some values may have been changed since it was last read."

Overvåger det lige lidt.

Gad vide om man hyre konsulenter med megen indsigt og erfaring med ASP/SQL. Kunne være godt med en andens mening på koden :-) Specielt når den skal være optimeret til det yderste.
Avatar billede ldanielsen Nybegynder
11. april 2006 - 13:49 #7
Jeg kunne godt tænke mig at se noget mere kode, måske kan jeg se noget. 

Måske kunne man lave en stored procedure der klarede noget af opgaven?

Endelig er der jo muligheden for at det er triggers der laver rod i det, har du triggers på den tabel der opdateres?
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
Kurser inden for grundlæggende programmering

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