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.