Rollback permet d'abandonner une transaction.
# Transaction : on débite un compte CPT_D et crédite un compte CPT_C
# d'une même valeur TRANSFERT. Au retour du sous-programme,
# SUCCES=1 si tout s'est bien passé, et SUCCES=0 sinon.
#
TRANSFERT_SOMME
#
# Début de transaction
Trbegin [CPT]
#
# On débite le premier compte
Readlock [CPT]NOCPT=CPT_D
If fstat : Goto ABANDON : Endif
[CPT]SOLDE -= TRANSFERT
Rewrite [CPT]
If fstat : Goto ABANDON : Endif
#
# On crédite le second compte
Readlock [CPT]NOCPT = CPT_C
If fstat : Goto ABANDON : Endif
[CPT]SOLDE += TRANSFERT
Rewrite [CPT]
If fstat : Goto ABANDON : Endif
#
# Validation de la transaction et retour.
Commit : SUCCES = 1
Return
#
# Annulation de la transaction et retour en cas d'erreur
ABANDON
Rollback : SUCCES = 0
Return
Rollback permet d'annuler une transaction, c'est-à-dire un ensemble d'opérations de mise à jour de fichiers et/ou de compteurs ainsi que des opération de verrouillage ayant débuté par l'instruction Trbegin.
Les tables sont restaurées dans l'état où elles étaient avant l'initiation de la transaction puis refermées et tous les verrous sont levés. Seuls les verrous posés sur des symboles avant le début de la transaction ne le seront pas. La transaction n'est pas inscrite dans le fichier de journalisation - le cas échéant.
Un Rollback ne peut être fait que par le traitement ou le sous-programmme ayant initié la transaction. C'est le cas en particulier pour les programmes de gestion d'erreur, de gestion d'interruption ou de déconnexion.
En cas d'interruption d'un programme ou d'un sous-programme ayant initié une transaction un Rollback sera fait automatiquement. Ceci est valable dans les cas suivants :
L'utilisateur sera averti de cette annulation.
Alors que l'instruction Commit est très rapide, Rollback est une opération qui peut être longue puisqu'il s'agit de "rejouer" à l'envers toutes les modifications apportées à la base de données. Il ne faut donc pas en faire un outil de programmation.
Rollback ne porte évidemment pas sur les variables et les fichiers séquentiels ouverts par Openo et Openio.
Exemple :
$TR : # Début de la transaction
Trbegin
If [V]COMP = 0
[V]COMP = [C]CPT
Endif
[C]CPT += 1
If fstat = 1 : # En cas de verrouillage
Rollback : Goto TR : # de [C]CPT par un autre
Endif : # adonix qui l'incremente
Commit
....
Supposons que [V]COMP soit nul au départ et que [C]CPT soit à 23. Si on n'a aucun problème on aura à la fin [V]COMP à 23 et [C]CPT à 24. Mais dans le cas où le même traitement a été lancé sur un autre poste, on aura à la fin [V]COMP à 23 et [C]CPT à 25.