Avatar billede ow.ob Nybegynder
09. juni 2001 - 00:13 Der er 10 kommentarer og
1 løsning

Locking i MS SQL 2000 mod IIS 5.0

Jeg har en række tabeller som der konstant bliver tonset data ned i.

Jeg laver det via ado på følgende måde

connection.begintrans
connection.execute(\"Delete * from Table\")
do until iTal=100
connection.execute (\"Insert Into Table (FELT1) values (\'DAVS\');\"
ital=ital+1
loop
connetion.committrans

MIT PROBLEM er at så snart at jeg har fyret begintrans af OG foretaget ændringer i basen (Delete eller add) så kommer der locks på records. Dvs at min IIS 5.0 ikke kan trække på queryen FØR at committrans er fyret af. Da det kan køre over fx. 128 Kb linier kan det risikere at tage lang tid før en committrans kommer og frigiver tabellerne. Samtidig kan der være op til 40 lokationer der på forskudt tid skriver til basen og dermed opnår jeg konstant låsning.

Jeg har prøvet at rode med Select ... From ... WITH (NOLOCKS) men den skid.. bare højt og flot på transaktionen og læser alt. Den duer ikke.

Jeg er tæt på bar bund.


Avatar billede slash Nybegynder
11. juni 2001 - 10:26 #1
kan du ikke bruge set lock_timeout? Har du prøvet cursors?
Avatar billede slash Nybegynder
11. juni 2001 - 10:28 #2
prøv at læse lidt i sqlserver 2000 books online! Den er fyldt med læsestof om locks og her skulle du nok kunne finde noget der kan bringe dig videre
Avatar billede ow.ob Nybegynder
11. juni 2001 - 12:08 #3
Hvad gør lock_timeout (er lidt grøn med SQL serveren) - Som det er i øjeblikket går der ca. 30 sekunder før timeout\'en kommer. Når der ikke er locks (dvs. at der ikke tilføjes i db\'en) kommer svaret på under 1 sek.

Cursors: jeg kan ikke finde noget sted i Frontpage 2000, hvor jeg kan sætte cursors ?
Avatar billede gandalfthewhite Nybegynder
11. juni 2001 - 12:14 #4
Transactions bevirker ikke at der ikke bliver placeret locks på dine data pages.

Dit problem ligger nok i at når du laver en insert bliver der placeret en Exclusive Lock der hvor den næste record skal indsættes. Da du har slettet alt i tabellen, vil ligge i begyndelsen af tabellen.

En Exclusive Lock forhindre al anden aktivitet der hvor locken er placeret.

Din transaktion bevirker i princippet at din lock bliver opretholdt i længere tid, indtil alle dine inserts er løbet ind.

Du burde nok se på om ikke det er mulig at udføre insert logikken mere effektivt. En anden mulighed er at oprette flere tabeller, hvor de forskellige lokationer indsætter. Dette kan så efterfølgende konsolideres over i en tabel.

En mulighed var måske indenfor din transaction, at oprette en #temp tabel hvor du først indsætter data, derefter sletter du indholdet i target tabellen, og indsætter indholdet fra temp tabellen. Dette burde formiske den tid hvor der er lock på target tabellen, da insert fra temp tabellen burde være langt hurtigere.

Husk at droppe #temp tabellen bagefter.
Avatar billede slash Nybegynder
11. juni 2001 - 12:17 #5
lock_timeout specificerer hvor lang tid låsen skal holdes prøv evt. set lock_timeout = 1000 (angives i millisekunder)
Avatar billede slash Nybegynder
11. juni 2001 - 12:18 #6
info om cursors finder du sql-server books online!
Avatar billede gandalfthewhite Nybegynder
11. juni 2001 - 12:24 #7
--> slash
SET LOCK_TIMEOUT specificere hvor lang tid man skal vente på at en lås bliver frigivet. Der er en væsentlig forskel.

Man kan ikke bestemme hvor lang tid en lås skal holdes. En lås bliver frigivet når den ikke længere er nødvendig.
Avatar billede ow.ob Nybegynder
11. juni 2001 - 12:46 #8
--> Gandalfthewhite:
Jeg har indtil videre lavet lidt af det du foreslår. Dog via replikering (jeg vidste ikke bedre) - således at ændringer i \"arbejdskopiens\" indhold replikeres over i en anden tabel. Herfra kan IIS\'en arbejde problemfrit. Det virker faktisk fint. Tak for tippet.
Avatar billede slash Nybegynder
11. juni 2001 - 12:49 #9
jeg synes at have oplevet at replikering i sql-serveren skaber deadlocks! Er dette noget i kan be/afkræfte?
Avatar billede ow.ob Nybegynder
11. juni 2001 - 14:00 #10
Også når replikeringen kun går den ene vej ?
Avatar billede gandalfthewhite Nybegynder
11. juni 2001 - 16:26 #11
Der er ingen tvivl om at locking problemer også kan opstå ved replikering. Derfor bør replikering ske på tidspunkter hvor der ikke erså meget aktivitet, f.eks. om natten.

Replikering er vel groft sagt en automatiseret updatering/insert som på samme måde sætter locks på tabeller/pages/extents som alle andre action queries.
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
Computerworld tilbyder specialiserede kurser i database-management

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