Avatar billede hrc Mester
23. februar 2010 - 13:01 Der er 7 kommentarer og
1 løsning

Blocking transactions i MSSQL via ADO

Jeg har netop kæmpet med at få en kunde op igen fordi der var Blocking Transactions på deres SQL2005 database. Antager den situation er en Deadlock, men at det i MS' regi kaldes Blocking transactions.

Programmet kører for en stor del via stored procedurer, men der e r også direkte SQL-skrivninger.

Hvor der er er flere felter/tabeller der skal opdateres, bruger pakkes det ind i transaktioner. Ved enkeltopdatering og i SPROC's gør jeg ikke noget aktivt (stoler på ADO og MSSQL gør det for mig)

Transaktionerne køres via ADOConnection.BeginTrans, ..CommitTrans og RollbackTrans. Disse kommandoer har jeg pakket ind i metoder under det TDataModul som TADOConnection ligger i.

Jeg vil gerne gerne BeginTrans giver en exception hvis der er en blokade. Så kan jeg lave et lille loop (max 10) hvor den forsøger igen i tilfældige intervaller. Kan man det?

Hvordan håndterer I andre deadlocks?
Avatar billede arne_v Ekspert
23. februar 2010 - 16:39 #1
Med et hoejt transaction isolation level er deadlocks altid en mulighed.

Software boer laves saa det retryer transaktioner i tilfaelde af deadlocks.

DBA boer tune database konfiguration (og inistere paa hardware) som sikrer at deadlocks ikke sker for tit. Fordi hvis retry ogsaa fejler, saa sander alt til.
Avatar billede hrc Mester
23. februar 2010 - 19:13 #2
Hej Arne. Jeg har desværre ikke ret megen indflydelse på hvad vores kunder vælger at køre programmet på. Det spænder fra virtuelle maskiner hvor harddisk og ram (og bagvedliggende CPU) altid er for lille, til maskiner med mange terrabytes diskplads og ditto masser af ram (og 2 quad-core CPU) (sidstnævnte konf. har jeg lige konverteret en 60Gb database og det gik dælme hurtigt)

I tilfældet med blokerende transaktioner var det netop en svagere VM. Problemet jeg oplevede var, at der ikke blev raiset nogen exception - for så kunne jeg have lavet førnævnte loop. Alt låste og CPU-belastningen drønede op og ned.

Har det noget med, at transaktioner blev kørt automatisk de steder hvor tingene låste - altså opdateringer hvor jeg ikke havde startet transaktionerne?
Avatar billede arne_v Ekspert
24. februar 2010 - 02:55 #3
Det synes jeg ikke burde ske.

Men man skal jo se meget for at slide hul i brilleglassene som Bent Larsen engang sagde.

Har du læst dig igennem:
  http://support.microsoft.com/kb/224453
?
Avatar billede hrc Mester
24. februar 2010 - 12:10 #4
Ja, og jeg kan ikke ligefrem påstå det hjalp. Blev bare forvirret på et højere niveau.

Er den forventede effekt af blocking transactions (deadlock?) at den skal raise en exception? Jeg kan ikke se noget hvor en timeout kan angives. Det er måske noget der sættes på serveren.

Ved Bent Larsen noget om MSSQL, eller Delphi (troede egentlig han var død)?
Avatar billede arne_v Ekspert
25. februar 2010 - 01:47 #5
Lidt mere læsning antyder at default ikke er timeout.

Check:

http://msdn.microsoft.com/en-us/library/aa259197%28SQL.80%29.aspx

så prøv:

SET LOCK_TIMEOUT 500
Avatar billede arne_v Ekspert
25. februar 2010 - 01:48 #6
Jeg er rimelig sikker på at Bent Larsen intet ved om SQLServer eller Delphi, men han lever stadig.
Avatar billede hrc Mester
28. februar 2010 - 21:33 #7
Hej Arne. Kunne se Bent holder til i Argentina (lyttede i øvrigt til tango da jeg Google ham), men jeg troede altså han var draget til det hellige skakmarker.

Selvom du faktisk lavede en sjælden slåfejl (har du auto-complete på dit tastatur?), så tror jeg du har fat i noget. Har tjekket serveren og dens timeout er default -1. Jeg prøver med 500 og håber programmet leverer en fejl jeg kan fange (hvis ikke, er der ikke noget at gøre ved det; det er bedre end hele systemet hænger). Håber ikke jeg skal gøre det ved alle installationer. Serverhoteller er måske lidt vrangvillige at få med på ideen.

.. Lægger du et svar?
Avatar billede arne_v Ekspert
28. februar 2010 - 21:47 #8
svar
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