MainframeSupports
tip uge 21/2000:

Fra og med version 4 af DB2 har det været muligt at benytte row-level locking. Den klare anbefaling fra IBM har været, at godt nok er row-level locking en mulighed, men man skal tænke sig rigtig godt om, før man kaster sig ud i det.

Nu har jeg fået lidt praktisk erfaring med nogle af konsekvenserne. Jeg oplevede, at få henvendelser vedrørende reasoncode 00C90096 som siger, at man har brugt alle sine låse (DSNZPARM NUMLKUS). Programmet havde virket dagen før, men tabellen havde fået ændret LOCKSIZE til ROW og LOCKMAX stod til 0, hvilket modvirker LOCK ESCALATION.

Problemet er i al sin gribende enkelthed, at nu tager DB2 en lås pr. række i stedet for pr. page, og hvis man har f.eks. 20 rækker pr. page, så skal man pludselig bruge 20 gange så mange låse. Hvis programmet afvikles med en commit-frekvens, så er det klogt at sætte den ned med en faktor 20 i det konkrete eksempel. I modsat fald vil det nok være tilrådeligt at lave programmet om til at acceptere en commit-frekvens. Min konklusion er, at man skal huske at justere sine commit-frekvenser ned med en faktor svarende til antallet af rækker pr. page på den tabel, man laver row-level locking på.

En anden løsning kunne selvfølgelig være at sætte NUMLKUS i vejret, men da denne parameter gælder for alle i hele DB2-subsystemet, så er det nok ikke den bedste ide. Man kan også ændre på parameteren LOCKMAX for det tablespace, man har ændret til LOCKSIZE ROW. Faktisk er LOCKMAX 0 et godt valg, da resultatet ellers hurtigt vil være LOCK ESCALATION, som betyder, at DB2 forsøger at lave alle row-locks om til een tablespace lock. Hvis tabellen benyttes af mange i parallel, er denne operation nærmest håbløs og vil resultere i en masse timeouts og måske også deadlocks. Og det karakteristiske ved tabeller, man sætter row-level locking på, er typisk mange parallelle brugere.

Mekanismen LOCK ESCALATION kan faktisk betyde, at når man indfører row-level locking, så risikerer man at skabe flere timeouts og deadlocks end før. Det er derfor vigtigt at kontrollere værdien af LOCKMAX. Hvordan du ændrer LOCKSIZE og LOCKMAX og betydningen af de tilhørende parametre kan du læse meget mere om i DB2 version 5 manualen SQL Reference under ALTER TABLESPACE.

Sidste uges tip        Tip oversigten