Vous êtes sur la page 1sur 12

Le COMMIT dans les programmes Batch

Avec DB2 Global Services


LE COMMIT
DANS LES PRORAMMES BATC!
A"EC DB2
Le prsent document constitue un guide mthodologique de gestion des commits dans les
programmes batch dans un environnement db2.
Il a t rdig en mars 1995 par Yves Benaroch, puis ractualis en uin 2!!! par "red
#atel.
Il contient un e$pos des r%gles d&implmentation de l&ordre #'((I) et de diverses
implications dans la programmation.
Les r%gles e$poses visent * garantir une intgrit des donnes mises * ours en cas de
traitement normal et en cas de reprise apr%s incident, tout en conservant des obecti+s de
per+ormance.
,rincipe -nral che. /00# 1
)'2/ les programmes batch ralisant des mises * our doivent +aire des
commits intermdiaires si leur dure totale de traitement dpasse 3! secondes.
Page : 1 / 12
Le COMMIT dans les programmes Batch
Avec DB2 Global Services
I # DE$INITION
%&% $onct'on
4uand l&ordre #'((I) est donn * 0B2, toutes les mises * our e++ectues dans les tables
0B2
depuis le dernier commit
depuis le dbut du programme, s&il s&agit du premier commit
sont entrines.
#&est * dire qu&* partir du moment o5 le commit est e$cut, les mises * our qui le
prc%dent sont d+initives. 6/au+ * recourir * des restaurations de tables * un point antrieur
par l&utilitaire 78#'987:.
)ant que le commit n&a pas t e$cut 6ou usqu&* la +in du programme:, les mises * our
sont rvocables.
%&2 S(nta)e
#&est un ordre /4L, qui dans un programme #'B'L, s&crit 1
8;8# /4L #'((I) 8<0=8;8#
'u
8;8# /4L #'((I) >'7? 8<0=8;8#
La s@nta$e A #'((I) >'7? B est quivalente * A #'((I) B. #ette s@nta$e rpond *
des besoins de compatibilit entre le /4LC de 0B2 et d&autres /4L.
%&* L'm'tat'ons de sa port+e
Dttention. L&ordre commit n&est pas tolr des environnements I(/ ou #I#/. Il est
simplement mis en commentaire par le prcompilateur. Les architectures telles que #I#/
assurent elles mEmes la gestion des mises * ours, pour 0B2 mais aussi pour l&ensemble
des ressources accdes 69/D(, etcF:. #&est le )>' ,GD/8/ #'((I).
Il est ralis par l&ordre 8;8# #I#/ /Y<#,'I<) 8<0=8;8#.
%&, COMMIT 'mpl'c'te o- e)pl'c'te
L&ordre 8;8# /4L #'((I) ralise un commit e$plicite.
)out processus qui se termine correctement 6ne se terminant pas par un abend: ralise un
commit implicite.
Il est donc inutile de coder un commit en +in de programme.
Dttention. Le positionnement par programme d&un code retour di++rent de .ro n&annule
pas le commit implicite de +in de programme.
Page : 2 / 12
Le COMMIT dans les programmes Batch
Avec DB2 Global Services
C 1 /tructured 4uer@ Language 1 norme internationale commune 6* nH pr%s: * tous les
/-B0.
II . /TILITE # NECESSITE
2&% Cond't'on m'n'male
2n commit n&est utile dans un programme que si lui ou un de ses sous=programmes ralise
au moins une mise * our sur une table db2.
0epuis la 95 de 0B2 et l&introduction des utilitaires A online B, il est ncessaire de placer
un commit dans un plan A lecture seuleB pour permettre * une reorg de se terminer
normalement 6phase de />I)#G: pendant l&e$cution d&un batch concurrent. #ette
mesure est encore * l&tude et n&est pas, pour l&instant, un standard.
2&2 In-t'l't+
/i le plan d&un programme A lecture seule B est bind avec l&option I/'LD)I'<6#/:
6#ursor /tabilit@, d+aut /00#:, un commit ne sert * rien, car les pages lues restent
quoiqu&il arrive accessibles par les autres plans.
/i ce plan est bind avec I/'LD)I'<677: 67epeatable 7ead:, les pages lues restent
verrouilles pour Etre relues plus rapidement, et interdisent ainsi tout acc%s concurrent. Le
commit lib%re les verrous et rend les pages accessibles.
)oute+ois, un plan A lecture seule B bind avec I/'LD)I'<627: 62ncommited 7ead,
usuellement dconseill: ne sera pas victime des verrous poss par d&autres plans, avec le
risque de lire des donnes errones ou supprimes.
2&* Pl-s'e-rs o01ect'2s v's+s
2&*&% Ass-rer -ne me'lle-re conc-rrence d3acc4s a-) donn+es des ta0les DB2&
Les donnes modi+ies 6I</87), 2,0D)8, 08L8)8: par un programme sont
verrouilles et inaccessibles, en lecture ou mise * our, * tous les autres plans 6sau+ binds
en 27:. /i elles ne sont pas libres su++isamment vite, les plans demandeurs reIoivent un
sqlcode J911 608D0L'#? ou )I(8'2) : et tombent en principe en abend 6ce point sera
dvelopp plus loin:. /eul le plan Amodi+iant B voit les donnes modi+ies, et peut donc les
relire ou les modi+ier de nouveau.
Il est donc imprati+ d&e++ectuer des commits +rquents, * un r@thme in+rieur * la limite de
timeout 6dure variable selon les db2 et in+rieure * K! secs: pour optimiser les acc%s
concurrentiels.
)oute+ois, il convient galement d&appliquer certaines r%gles, telles que
prohiber les ordres L'#? )DBL8 dans les programmes
viter les binds avec I/'LD)I'<677:
viter les L'#?/IL8 )DBL8/,D#8 ou )DBL8
etcF
qui ont pour consquence d&annuler les e++ets du commit.
Page : 3 / 12
Le COMMIT dans les programmes Batch
Avec DB2 Global Services
2&*&2 Acc+l+rer le process-s de reto-r arr'4re 5ROLLBAC67
Il est interdit de laisser un programme raliser des mises * our sans commit intermdiaire
pendant un temps trop long. <ous avons d* vu que pendant cette priode les pages
modi+ies restaient indisponibles au$ autres utilisateurs.
(ais si pour une raison quelconque, abend ou rollbacM programm, le programme doit
revenir en arri%re, donc remettre les donnes dans leur tat d&origine, les pages resteront
bloques usqu&* la +in anormale du programme ou usqu&* la compl%te e$cution de
l&ordre 7'LLBD#?.
#lassiquement, l&annulation par 0B2 des modi+ications prend autant de temps que les
modi+ications elles=mEmes. #e qui doublera le temps d&indisponibilit des donnes.
2&*&* Permettre -n red+marrage rap'de de DB2
Lorsque se produit un arrEt inattendu de 0B2, tous les processus de mise * our en cours
au moment de l&arrEt seront suivis d&un 7'LLBD#? lors du redmarrage. Le 0B2 ne sera
disponible, que lorsque tous les processus de 7'LLBD#? seront termins.
'n comprend donc que si au moment de l&arrEt d&un 0B2, tournait un programme
responsable de millions de mises * our, sans commit intermdiaire, depuis des heures, on
risque au redmarrage d&attendre autant de temps 6sinon plus: pour que 0B2 puisse
annuler toutes les modi+ications non commites. #&est la totalit du 0B2 qui sera cette +ois
indisponible.
#e dernier point sera amlior avec la 9K de 0B2 mais cette perspective n&autorise pas
pour autant les mises * our sans commit intermdiaire.
Page : 4 / 12
Le COMMIT dans les programmes Batch
Avec DB2 Global Services
III . /NITE LOI8/E DE TRA"AIL . /NITE DE RECO"ER9
*&% L3-n't+ log':-e de trava'l 5L/;7
L&unit logique de travail est constitue d&une squence d&oprations qui sont logiquement
lies entre elles et insparables. L&unit logique de travail est inscable du point de vue
applicati+ pour assurer une cohsion des donnes.
,ar e$emple, l&enregistrement d&une transaction bancaire est une unit logique de travail
constitue de 1
la cration du mouvement 6I</87) dans la table des mouvements:
la mise * our du solde du compte 62,0D)8 dans la table des soldes:
Il n&est pas concevable de modi+ier le solde sans crer le mouvement * l&origine de la mise
* our du solde du compte. #es deu$ oprations de mise * our sont solidaires, on ne peut
envisager l&une sans l&autre.
On ne do't pas r+al'ser de comm't a- m'l'e- d3-ne -n't+ log':-e de trava'l&
L&unit logique de travail doit Etre la plus +ine possible.
2n commit ne peut Etre +ait qu&* la +in d&une unit logique de travail.
2n rollbacM peut survenir au milieu d&une unit logique de travail.
*&2 L3-n't+ de resta-rat'on o- -n't+ de RECO"ER9 5/R7
L&unit de restauration ou unit de recover@ est constitue d&une squence d&units
logiques de travail. #&est cette squence de mises * our qui doit Etre globalement entrine
ou re+use.

#haque squence est dlimite par un commit ou un rollbacM. 0ans le cas standard, une
unit de recover@ est constitue de ce qui spare deu$ commits.
Gabituellement, dans un conte$te transactionnel 6#I#/, etcF:, les notions d&unit logique
de travail et d&unit de recover@ se superposent et se con+ondent. Il n&est pas recommand,
en standard, de coder un commitNs@ncpoint dans un programme #I#/.
,ar contre, dans un conte$te batch, une unit de recover@ correspond souvent * plusieurs
units logiques de travail. L&e$cution du commit gnrant 2 IN', il peut Etre pnalisant de
raliser des commits trop +rquents.
Page : 5 / 12
Le COMMIT dans les programmes Batch
Avec DB2 Global Services
I" . LES CONSE8/ENCES D/ COMMIT
,&% Les cons+:-ences s-r le s(st4me de verro-'llage
)ous les verrous acquis sur les pages de donnes 6ou sur les pages d&inde$ pour les inde$es
de t@pe 1: sont librs, sau+ sur celles lies * la position d&un curseur >I)G G'L0.
,&2 Les cons+:-ences s-r les a-tres ordres S8L
)ous les curseurs ouverts sont automatiquement +erms sau+ ceu$ dclars avec l&option
>I)G G'L0 O
)ous les ordres ,78,D78 6sql d@namique: sont perdus, sau+ si le programme est bind
avec l&option ?88,0Y<D(I#6Y8/:.
Page : 6 / 12
Le COMMIT dans les programmes Batch
Avec DB2 Global Services
" # LES IMPLICATIONS DANS LA PRORAMMATION
<&% La ta0le de repr'se
#haque programme qui ralise des commits doit normalement possder une ligne qui lui
est associe dans une table de reprise.
/i un programme peut s&e$cuter en A multi=init B ou en A occurrences multiples B, la table
de reprise doit possder autant de lignes associes * ce programme que le nombre
ma$imum d&occurrences de ce programme.
8n dbut de traitement, le programme doit lire la ligne qui lui est associe dans la table de
reprise, et le cas chant savoir A d@namiquement B retrouver la bonne occurrence. Dinsi, il
connaPtra sa cl de repositionnement, et sa +rquence de commit.
D la +in de chaque unit logique de travail, le programme A se demande B s&il est utile de
+aire un commit, donc s&il est en +in d&unit de recover@. /i la rponse est positive, il
commence par mettre * our sa ligneNoccurrence de reprise avec la nouvelle valeur de la
cl. Le commit doit Etre e$cut immdiatement apr%s cet 2,0D)8.
0es prcautions particuli%res sont prises pour minimiser les risques de contention lors des
mises * our sur les tables de reprise 1
conserver une ligne de Q M 6une page enti%re: par adonction de +iller.
prohiber le compactage qui annulerait la mesure prcdente
L'#?/IL8 ,D-8 ou L'#?/IL8 7'> 6verrouillage * la ligne:
vri+ier dans les e$plains que les acc%s * la table de reprise se +ont par l&inde$ unique,
et que toutes les colonnes sont adresses
considrer la table comme critique du point de vue des per+ormances 6surveillance des
disques, droulement des utilitaires, etcF.:
<&2 # L3opt'on ;IT! !OLD dans les c-rse-rs
Le ou les curseurs, qui sont ouverts pendant l&e$cution de l&ordre commit, doivent Etre
dclars >I)G G'L0, ce qui empEchera leur +ermeture implicite.
#&est au programme de dcider de la +ermeture ou non des curseurs, et de leur rouverture.
#ette option est particuli%rement utile si, comme c&est souvent le cas en batch, l&ouverture
d&un curseur est longue et coRteuse. ,ar e$emple, si les inde$ sont peu ou mal accds, si
des tris 6order b@, group b@, distinct: sont ncessaires sur un volume important de lignes.
)outes ces oprations doivent Etre renouveles * chaque ouverture de curseur. L&option
>I)G G'L0 permet de n&Etre pnalis qu&une +ois par le poids du curseur, quel que soit
le nombre de commits.
Page : 7 / 12
Le COMMIT dans les programmes Batch
Avec DB2 Global Services
<&* La cl+ de repr'se . Le repos't'onnement
<&*&% Le repos't'onnement pe-t =tre 2onct'onnellement 'mp+rat'2&
La cl de reprise doit correspondre * un identi+iant unique du point de vue de l&unit
logique de travail. 8lle peut Etre composite.
'n doit pouvoir retrouver sans quivoque la derni%re unit logique de travail accde lors
du traitement incomplet prcdent.
,ar e$emple, un programme doit augmenter les pri$ de tous les articles de 1H.
8n cas d&interruption anormale, il est pr+rable de ne pas rappliquer l&augmentation au$
articles d* traits la +ois prcdente.
,our cela le curseur doit tenir compte du repositionnement.
8;8# /4L 08#LD78 #27/S1 #27/'7 >I)G G'L0 "'7
/8L8#) D7)I#L8, ,7I;S98<)8
"7'( )DBSD7)I#L8
;!ERE ARTICLE > ?DERNIER#ARTICLE#L/
ORDER B9 ARTICLE
8<0=8;8#
<&*&2 Le repos't'onnement pe-t =tre s-per2l-
#ertains programmes mettent * our ou suppriment les crit%res de slection du curseur.
,ar e$emple, on supprime d&une table historique les lignes dont la date de cration est
antrieure * K mois.
8;8# /4L 08#LD78 #27/S1 #27/'7 >I)G G'L0 "'7
/8L8#) 0D)8S#78D), D7)I#L8
"7'( GI/)'SD7)I#L8
;!ERE DATE@CREAT A ?DATE#LIMITE
8<0=8;8#

Il est vident que lors d&une reprise du programme apr%s un arrEt anormal, les lignes, dont
les dates satis+aisaient * la condition, n&apparaPtront plus lors de la nouvelle ouverture du
curseur. Il est donc inutile d&imaginer un autre s@st%me de reprise.
0e mEme, on e$trait d&une table toutes lignes insres dans la ourne et non encore
traites, en positionnant un indicateur de traitement.
8;8# /4L 08#LD78 #27/S1 #27/'7 >I)G G'L0 "'7
/8L8#) D7)I#L8, I<0I#S)7DI)
"7'( (9)SD7)I#L8
;!ERE INDIC@TRAIT B C C
8<0=8;8#
D la relance, les lignes traites prcdemment ne satis+eront pas la condition.
Page : 8 / 12
Le COMMIT dans les programmes Batch
Avec DB2 Global Services
"I . $RE8/ENCE DE COMMIT
D&% Le comm't to-tes les n l'gnes
,ar abus de langage, nous parlerons par+ois d&un nombre le lignes, alors qu&il +aut parler
d&un nombre d&units logique de travail.
La mthode, qui semble la plus naturelle, pour dterminer s&il +aut e$cuter un commit ou
non, est de compter les mises * our et de se dterminer en +onction d&un seuil. <anmoins,
elle prsente quelques inconvnients.
,our des raisons de charge ou de priorit, d&une e$cution * l&autre un mEme programme
peut mettre plus ou moins de temps * traiter le mEme volume de A lignes B, et la condition
A cptr T n B peut Etre plus ou moins longue * satis+aire.
0e mEme, si une condition d&e$traction est pose sur une colonne non inde$e, dont la
dispersion dans la table est +luctuante et alatoire 6e$ 1 ,7I;S98<)8 T 1!!!!:, le volume
de donnes variera d&un traitement * l&autre et surtout le temps coul entre deu$ lignes *
traiter et donc entre deu$ commits.
D&2 Le comm't to-tes les n secondes
#&est cette solution qui a notre pr+rence, car elle limine presque totalement les
inconvnients maeurs e$poss plus haut.
<ous recommandons actuellement un commit toutes les 5 secondes.
0%s qu&une unit logique de travail est accomplie, le programme A se demande B s&il s&est
coul plus de n secondes depuis le dernier commit. /i c&est le cas la squence de commit
sera e$cut, sinon le programme continue normalement et la prochaine unit logique est
traite, et ainsi de suite usqu&* ce que le seuil soit atteint.
Les commit * +rquence strictement constante peuvent par+ois prsenter des inconvnients.
Il importe dans certains cas 6tables tr%s sollicites: qu&un commit soit indispensable,
quelles que soient les conditions normales. Il importe donc de pouvoir +orcer un commit.
D&* Le comm't E 2r+:-ence trop +lev+e
<anmoins, si les units logiques de travail sont simples, et qu&un commit est +orc apr%s
chacune d&elles, la dure elapsed du programme augmentera. 8n e++et, un commit +orce
dans 0B2 deu$ critures s@nchrones 602DL L'--I<-: sur les +ichiers de log. #eci a un
coRt.
2n ratio de plus d&un commit par seconde est * proscrire, sau+ pour la mise * our de tables
e$trEmement sensibles au$ con+lits d&acc%s. Il doit +aire l&obet d&un avis des 0BD.
Page : 9 / 12
Le COMMIT dans les programmes Batch
Avec DB2 Global Services
"II . STR/CT/RE DES PRORAMMES
F&% Programme ent'4rement DB2
#&est le cas idal. )outes les mises * our sont alignes sur le mEme point de commit.
La structure gnrale est la suivante 1
lecture de la table de reprise, chargement de la cl de reprise
ouverture du curseur maPtre
boucle de traitement
+etch d&une ligne du curseur maPtre
lectures et mises * our pour raliser une unit logique de travail
test sur la dure depuis le dernier commit
si la limite est atteinte 1 mise * our de la table de reprise et commit
sinon 1 poursuite de la boucle
+in de la boucle
mise * our de la table de reprise avec la valeur minimum de la cl
+in du programme
7%gle 1 d%s qu&un programme met * our des donnes 0B2, il ne doit mettre * our que des
donnes 0B2 6 donc e$clure les critures sur squentiels ou 2,0D)8 9/D(:
F&2 $'ch'er5s7 s+:-ent'el5s7 en entr+e
#e cas de +igure se ram%ne au cas prcdent, il su++it de considrer les +ichiers squentiels
comme l&quivalent de curseurs 0B2. Il +aut donc prvoir un mcanisme de
repositionnement usqu&au dernier enregistrement trait et commit. ,ar scurit, le +ichier
ph@sique a@ant pu changer entre l&abend et la relance, il est pr+rable de conserver, dans la
table de reprise, la cl du +ichier et son rang, et de vri+ier au redmarrage que les deu$
correspondent.
F&* $'ch'ers s+:-ent'els en +cr't-re
)@piquement, ce sont les programmes d&apurement, avec sauvegarde sur +ichier des lignes
supprimes. Il est tr%s dangereu$ de mlanger dans le mEme programme des critures sur
des +ichiers squentiels avec des mises * our 0B2.
8n e++et, les critures sur les +ichiers squentiels sont ralises par (9/ par
e$ternalisation de ses bu++ers. #ette opration n&est pas, pour l&instant, s@nchrone avec le
commit 0B2. 'r, il est touours possible qu&un probl%me survienne lors de l&criture
ph@sique 1
erreur d&entre sortie 6disque ou lecteur hors service:
plus de place sur le disque
nombre ma$imum d&e$tends atteint
etcF
Page : 10 / 12
Le COMMIT dans les programmes Batch
Avec DB2 Global Services
2ne telle pratique est d&autant plus dangereuse, qu&elle peut tr%s bien +onctionner sans
probl%me pendant une longue priode. 8t le our o5 le probl%me survient, il n&est pas
certain qu&il soit mis en vidence. /a rsolution est d&autant plus improbable.
Dnciennement couramment utilise, notamment par les 8tudes -rands (agasins, cette
technique est auourd&hui * proscrire.
Les risques sont auourd&hui les mEmes pour les +ichiers 9/D(. <anmoins, une solution
semblable au )>' ,GD/8/ #'((I) 6voir plus haut: est annonce pour bientUt.
F&, No-vea-t+ %GGG&
8n 1999, les 8tudes -rands (agasins ont e$priment une nouvelle technique pour leur
chaPne 7sultats 2nitaires, particuli%rement lourde et sensible. 8n plus de l&introduction du
paralllisme et du sous=programme #()8;I), certains batch ont bn+ici de la gestion
du sqlcode J 911 6 timeout ou deadlocM:.
8n e++et ce sqlccode est l&un des plus +rquents, il traduit une contention de verrouillage
temporaire. 0e plus il s&accompagne d&un 7ollbacM implicite depuis le prcdent commit.
L&ide de base tait de permettre * un programme de repartir lui mEme * son point de
dpart logique 6rcupration de sa cl de reprise et ouvertures des curseurs maPtres: apr%s
avoir dtect un sqlcode =911 sans attendre une intervention humaine. 8n e++et, usqu&ici il
+allait gnrer une +in anormale du programme par Dbend et attendre qu&il soit relanc par
les pilotes, ce qui tait par+ois une cause de retard important..
La solution suggre consiste * prendre en charge ce sqlcode J911 et tenter de
recommencer le traitement un certain nombre de +ois.
EXEC SQL UPDATE TABLE1
SET COL3 = :H-V
, COL4 = :H-V
WHERE COL1 = :H-V
AND COL2 = :H-V
END-EXEC.
apr%s l&e$cution de l&update, la rcupration du sqlcode J911
permet d&viter de laisser +iler l&abend et de redmarrer au dbut programme
IF SQLCODE NOT = 0 AND SQLCODE NOT = -11
CALL DB2ANOS !.
.....
ELSE
IF SQLCODE = -11 AND CPT-LOC" #= 10
ADD 1 TO CPT-LOC"
$O TO %&'()* +,-.,/0012
END-IF
END-IF.
3OVE 0 TO CPT-LOC"
<anmoins, cette mthode inclut un surcoRt en programmation et en tests, surtout pour les
programmes d* crits. 8n e++et le test du sqlcode doit Etre appliqu * to-s les ordres, pas
seulement au$ mises * ours, et la structure gnrale du programme doit Etre compatible
avec le principe du redmarrage. 8lle semble donc rserve au$ chaPnes sensibles qui le
Page : 11 / 12
Le COMMIT dans les programmes Batch
Avec DB2 Global Services
ncessitent rellement. 2ne mauvaise prise en compte de cette suggestion risque d&avoir de
+unestes consquences, il +aut donc ne pas hsiter * solliciter une validation des 0BD.

Page : 12 / 12