Nogen gange sker det, at man afvikler nogle jobs samtidigt, som ikke
kan tåle at køre samtidigt. Et eksempel er to jobs, der opdaterer
de samme DB2-tabeller og derfor nogle gange deadlocker med hinanden. Der
findes en nem løsning på den slags problemer og det handler
ugens tip om.
Når et dataset i et job benyttes med DISP=OLD (i stedet for DISP=SHR),
vil det ikke være muligt for andre at benytte det samme dataset samtidigt.
Jobbet går først i gang, når ingen andre benytter datasettet
og ingen andre kan benytte datasettet før det sidste step i jobbet,
der benytter datasettet, er slut. "Andre" er i denne forbindelse ikke alene
jobs, men også started tasks og TSO-brugere.
Man kan altså undgå, at to jobs kører samtidigt,
ved at lade begge jobs benytte det samme dataset med DISP=OLD. Det bedste
er, at oprette et særligt dataset til formålet i stedet for
at anvende et eksisterende, som måske benyttes til andre ting. Faktisk
kan man oprette datasets, der ikke fylder noget og dermed heller kan indeholde
nogen data. Det gøres lettest med følgende step:
//IEFBR14
EXEC PGM=IEFBR14
//DUMMYDSN DD
DSN=MIT.DISP.OLD.DATASET,DISP=(MOD,CATLG,CATLG),
//
UNIT=SYSALLDA,SPACE=(TRK,0)
Steppet opretter datasettet MIT.DISP.OLD.DATASET, og hvis det findes i
forvejen, sker der intet. De to jobs, man ønsker at forhindre i
at køre samtidigt kan nu benytte dette dataset med DISP=OLD. Alt,
hvad der skal til, er at tilføje følgende linie i sine jobs
et passende sted:
//DUMMYDSN DD
DSN=MIT.DISP.OLD.DATASET,DISP=OLD
Der skal ingen programrettelser eller noget andet til og det fungerer uafhængigt
af, hvad problemstillingen ellers er, hvis jobbene kører samtidigt.