DOCUMENTATION EN LIGNE
DE WINDEVWEBDEV ET WINDEV MOBILE

Aide / WLangage / Gestion des bases de données / HFSQL / Gestion des transactions
  • Présentation
  • Manipuler les transactions par programmation
  • Mettre en place la gestion des transactions
  • Tableau récapitulatif des fonctions WLangage utilisées (pour une base de données HFSQL ISAM ou Client/Serveur)
  • Manipuler les enregistrements lors d'une transaction : les règles à suivre
  • Utiliser des Transactions courtes
  • Bloquer les enregistrements en lecture
  • Effectuer une seule transaction à la fois
  • Aucune interface utilisateur (fenêtre, état, page,...) ne doit être utilisée entre le début et la fin d'une transaction.
  • L'annulation d'une transaction peut parfois échouer car l'annulation d'une transaction peut provoquer des violations de contraintes d'intégrité et/ou de doublon.
  • Erreurs spécifiques à la gestion des transactions
  • Gestion des cas particuliers
  • Panne de courant
  • Conseil : rétablir la cohérence de la base de données
  • Erreur lors de l'utilisation du programme
  • Suppression du journal de transaction
  • Différences de comportement entre des transactions ISAM et Client/Serveur
  • Gestion avancée
  • Transaction : Les fichiers créés
  • Identifiant du poste réalisant la transaction
  • Transactions et contexte HFSQL indépendant
WINDEV
WindowsLinuxUniversal Windows 10 AppJavaEtats et RequêtesCode Utilisateur (MCU)
WEBDEV
WindowsLinuxPHPWEBDEV - Code Navigateur
WINDEV Mobile
AndroidWidget AndroidiPhone/iPadWidget IOSApple WatchMac CatalystUniversal Windows 10 App
Autres
Procédures stockées
Transactions : Sécurisez vos traitements sur des fichiers de données HFSQL
HFSQL ClassicHFSQL Client/ServeurDisponible uniquement avec ces types de connexion
Manipuler les transactions par programmation

Mettre en place la gestion des transactions

  1. Si vos fichiers de données sont protégés par mot de passe, ouvrez tous les fichiers de données utilisés pendant la transaction avant le début de la transaction ou spécifiez les différents mots de passe à l'aide de la fonction HPasse.
    Si vos fichiers de données ne sont pas protégés par mot de passe, les fichiers de données manipulés après la fonction HTransactionDébut (ou la fonction HTransaction) seront automatiquement mis en transaction.
  2. Commencez la transaction avec la fonction HTransactionDébut ou avec la fonction HTransaction.
  3. Effectuez vos opérations. Toutes les opérations d'écriture sur les fichiers de données en transaction sont automatiquement enregistrées dans le fichier de transaction. Attention : les traitements réalisés sont relativement plus lents (puisque chaque opération est enregistrée dans un fichier de données spécifique).
  4. Annulez si nécessaire les opérations réalisées pendant la transaction (fonction HTransactionAnnule).
  5. Spécifiez la fin de la transaction avec la fonction HTransactionFin : la transaction est validée.
Remarques :
  • HFSQL Classic Le mode d'isolation des transactions est le mode "READ UNCOMMITED".
  • HFSQL Client/Serveur Le mode d'isolation des transactions est défini avec la fonction HTransactionIsolation. Le mode d'isolation par défaut est le mode "READ UNCOMMITED".
  • Les transactions ne sont pas disponibles sur des fichiers de données Hyper File 5.5.

Tableau récapitulatif des fonctions WLangage utilisées (pour une base de données HFSQL ISAM ou Client/Serveur)

FonctionnalitésFonction WLangage
Activer ou non la gestion des transactions
(la gestion des transactions est active par défaut).
HGèreTransaction
HFSQL Client/Serveur Définir le mode d'isolation.
HTransactionIsolation
Débuter la transaction.HTransactionDébut ou HTransaction
Valider la transaction.HTransactionFin
Annuler la transaction en coursHTransactionAnnule
Annuler une transaction qui a échoué (panne de courant).
Savoir si une transaction a été interrompue (la transaction n'a été ni validée, ni annulée). Cas de panne de courant.HTransactionInterrompue
Si un enregistrement du fichier de données spécifié est considéré comme étant en transaction, mais n'appartient à aucune transaction en cours, il est automatiquement libéré.HTransactionLibère
Savoir si une transaction est en cours.HTransactionEnCours
Manipuler les enregistrements lors d'une transaction : les règles à suivre

Utiliser des Transactions courtes

Les enregistrements manipulés pendant la transaction sont automatiquement bloqués en écriture, pour empêcher d'autres postes de modifier les données concernées et donc pour sécuriser la transaction.
Dans une application en réseau, si un autre utilisateur tente de modifier un enregistrement en transaction, la gestion automatique des blocages laissera la possibilité à cet utilisateur d'annuler ou de retenter l'opération.
Il est donc nécessaire que la transaction soit la plus courte possible, pour éviter tout blocage des utilisateurs.

Bloquer les enregistrements en lecture

Toutes les modifications effectuées pendant une transaction sont visibles par tous les postes (sur un réseau par exemple) avant la fin de la transaction. Il est donc possible que les autres postes lisent des données dont la durée de vie est limitée (si la transaction est annulée par HTransactionAnnule par exemple).
Il est donc fortement conseillé de bloquer les enregistrements concernés en lecture.

Effectuer une seule transaction à la fois

Une application ne doit effectuer qu'une seule transaction à la fois. Il ne faut pas effectuer des transactions dans des threads simultanés ou dans des contextes HFSQL indépendants.

Aucune interface utilisateur (fenêtre, état, page,...) ne doit être utilisée entre le début et la fin d'une transaction.

Toutes les opérations de transaction doivent être réalisées dans un même traitement : la fonction HTransactionDébut (ou la fonction HTransaction) et la fonction HTransactionAnnule doivent être appelées depuis le même traitement ou événement : code de clic d'un champ Bouton, ...
Pour annuler une transaction à l'aide d'un bouton, utilisez un champ Bouton de type "Validation automatique" sur une courte durée. Vous éviterez ainsi d'éventuelles interactions avec les données manipulées depuis d'autres postes du réseau.

L'annulation d'une transaction peut parfois échouer car l'annulation d'une transaction peut provoquer des violations de contraintes d'intégrité et/ou de doublon.

Exemple 1 : Violation des contraintes de doublons
  • Un fichier de données manipulé par une transaction contient une clé unique.
  • Un poste A effectue une transaction pendant laquelle un enregistrement de ce fichier de données est supprimé.
  • Dans le même temps, un poste B ajoute un nouvel enregistrement dans le même fichier de données avec la même valeur de clé unique que l'enregistrement supprimé par le poste A.
  • L'annulation de la transaction à cet instant provoquera une erreur de doublon sur la clé unique.
Solution 1 : Retentez l'annulation de la transaction avec l'outil WDTrans (ou WDOptimizer). Cet outil permet notamment d'ignorer les erreurs de doublons et/ou d'intégrité (options "Débrancher la gestion de l'intégrité" et "Débrancher la gestion des doublons" dans l'assistant d'annulation de transactions).
Solution 2 : Utilisez la fonction HGèreDoublon avant d'annuler la transaction. Cette fonction permet d'ignorer temporairement la gestion des doublons. Dans ce cas, n'oubliez pas de rebrancher la gestion des doublons en positionnant le paramètre à Vrai après l'annulation de la transaction.
Vous devrez alors vérifier les enregistrements erronés et les modifier en conséquence
Exemple 2 : Violation des contraintes d'intégrité
  • Un fichier de données CLIENT manipulé est relié à un autre fichier de données COMMANDES (liaison sur une clé)
  • Un poste A effectue une transaction pendant laquelle un enregistrement est ajouté dans le fichier de données CLIENT.
  • Dans le même temps, un poste B ajoute un nouvel enregistrement dans le fichier de données COMMANDES relié à l'enregistrement ajouté dans le fichier de données CLIENT.
  • L'annulation de la transaction à cet instant provoquera une erreur d'intégrité, car l'enregistrement ajouté dans le fichier de données COMMANDES n'aura plus de liaison avec l'enregistrement supprimé dans le fichier de données CLIENT (l'ajout dans le fichier de données CLIENT aura été annulé).
Solution 1 : Retentez l'annulation de la transaction avec l'outil WDTrans (ou WDOptimizer). Cet outil permet notamment d'ignorer les erreurs de doublons et/ou d'intégrité (cochez les options "Débrancher la gestion de l'intégrité" et "Débrancher la gestion des doublons" dans l'assistant d'annulation de transactions).
Solution 2 : Utilisez la fonction HGèreIntégrité avant d'annuler la transaction. Cette fonction permet d'ignorer temporairement les erreurs d'intégrité (en positionnant le paramètre à Faux). Dans ce cas, n'oubliez pas de rebrancher la gestion de l'intégrité en positionnant le paramètre à Vrai après l'annulation de la transaction.
Vous devrez alors vérifier les enregistrements erronés et les modifier en conséquence.
Conseil : Prévoyez ce genre de conflits dans vos programmes et lors de la création des fichiers de données sous l'éditeur d'analyses.
  • Si vous utilisez des clés uniques de type identifiant automatique, les erreurs de doublons ne surviendront pas.
  • Si vous manipulez les clés uniques vous-mêmes (vous n'utilisez pas d'identifiants automatiques), prévoyez une valeur unique pour tous les postes lors d'ajouts (fonction HAjoute) ou lors de modifications (fonction HModifie) d'enregistrements.
    Rappel : Par défaut, pour chaque enregistrement posant problème, le moteur HFSQL propose la gestion assistée des erreurs : une fenêtre permet de corriger les conflits de doublons.

Erreurs spécifiques à la gestion des transactions

  • 70031 : Opération non autorisée en transaction
    Vous utilisez une fonction non autorisée pendant une transaction. Par exemple, la fonction HTransactionDébut (ou la fonction HTransaction) est utilisée en cours de transaction.
  • 70034 : La dernière transaction a échoué
    Vous tentez d'utiliser un enregistrement appartenant à une transaction qui a échoué (panne de courant, ...). Le programme est relancé sans avoir annulé la transaction. Dans ce cas, il est conseillé d'annuler la transaction qui a échoué (voir ci-dessous).
  • 74020 : Le mot de passe du fichier de Transaction ne correspond pas au mot de passe du fichier d'origine
    Le fichier de données (en mode HFSQL Client/Serveur) et le fichier de transaction n'utilisent pas le même mot de passe.
  • 70032 : Problème de mode d'insolation
    Cette erreur peut survenir dans les cas suivants :
    • Vous tentez d'utiliser la fonction HTransactionIsolation sur des fichiers de données qui ne sont pas au format Client/Serveur.
    • Vous tentez d'utiliser un mode d'isolation alors que la transaction n'est pas effectuée sur une connexion.
    • Vous tentez d'utiliser la fonction HTransactionIsolation alors que la transaction a déjà été débutée avec la fonction HTransactionDébut (ou la fonction HTransaction).
Gestion des cas particuliers

Panne de courant

Si une panne (coupure de courant, re-démarrage du poste, ...) survient pendant une transaction, les fichiers de données risquent d'être incohérents : la transaction n'a été ni validée, ni abandonnée. Le fichier de transaction est toujours présent sur le poste.
Dans ce cas, la cohérence de la base de données sera restaurée :
Attention : La restauration de la cohérence de la base peut être relativement longue.
Remarque : Pour savoir si la restauration de la cohérence de la base est nécessaire, testez le résultat de la fonction HTransactionInterrompue dans le code d'initialisation du projet (par exemple).

Conseil : rétablir la cohérence de la base de données

Pour rétablir la cohérence de la base de données, les opérations conseillées sont les suivantes :
  1. Testez le résultat de la fonction HTransactionInterrompue dans le code d'initialisation du projet par exemple.
  2. Si la transaction a été interrompue, effectuez une des opérations suivantes pour rétablir la cohérence de la base de données :
Exemple :
SI HTransactionInterrompue() = Vrai ALORS 
SI Confirmer("La transaction effectuée par le poste " + H.TrsPoste + ...
" a Ã©té interrompue. " + ...
"Voulez-vous rétablir la cohérence des fichiers de données ?") = Vrai ALORS
// Annule les transactions interrompues
SI HTransactionAnnule() = Faux ALORS
Erreur("Impossible d'annuler la transaction")
FIN
FIN
FIN
Autre solution : Il est également possible de gérer l'erreur 70034 dans l'événement "Initialisation" du projet grâce au mot-clé QUAND EXCEPTION. Ainsi, quand l'erreur 70034 surviendra, la cohérence de la base de données sera restaurée soit par la fonction HTransactionAnnule, soit par les fonctions HTransactionDébut/HTransactionFin.
Remarque : Après une coupure de courant, il est conseillé de ré-indexer les fichiers de données de l'application.

Erreur lors de l'utilisation du programme

Lorsque l'exécution de l'application est arrêtée à cause d'une erreur programme (division par zéro par exemple), la transaction en cours est automatiquement annulée.

Suppression du journal de transaction

Le journal de transaction est un fichier HFSQL créé et présent uniquement le temps de la transaction. Il ne faut pas supprimer ce fichier pendant la transaction sous peine d'incohérence de la base de données.

Différences de comportement entre des transactions ISAM et Client/Serveur

Comportement en HFSQL ClassicComportement en HFSQL Client/Serveur
Création d'un fichier de données pendant une transaction (fonction HCréation).Si la transaction est annulée, le fichier de données redevient vide.
Fermeture d'un fichier de données pendant une transaction (fonction HFerme).La transaction est interrompue.La transaction n'est pas annulée.
Déblocage d'un enregistrement/fichier de données pendant une transaction.Le blocage des transactions est annulé.
La transaction est interrompue.
Déblocage d'un enregistrement/fichier de données
La transaction n'est pas annulée.
Exécution d'une requête de type INSERT/UPDATE.La transaction est interrompue.La transaction n'est pas annulée.
Gestion avancée

Transaction : Les fichiers créés

Lors de la mise en place des transactions, deux types de fichiers HFSQL sont créés :
  • le journal des opérations en transaction : Fichier temporaire au format HFSQL contenant les différentes opérations réalisées sur les fichiers de l'application pris en compte par la transaction. Ce fichier est créé par la fonction HTransactionDébut (ou par la fonction HTransaction). Par défaut, son nom est <Nom du projet>_$TRS_OPERATION.TRS. Ce nom est modifiable avec la fonction HTransactionDébut (ou avec la fonction HTransaction).
    HFSQL Client/Serveur Ce fichier s'appelle TRSOPERATION.TRS.
  • le journal des valeurs : Fichier temporaire associé à chaque fichier de données pris en compte par la transaction. Ce fichier a pour nom <Nom du fichier de données>_$$_TRSVAL.TRX. Ce fichier contient pour chaque opération réalisée dans la transaction :
    • soit le contenu de l'enregistrement avant l'opération (lors d'une suppression par exemple)
    • soit le contenu de l'enregistrement après l'opération (lors d'un ajout par exemple)
      HFSQL Client/Serveur Ce fichier s'appelle <Nom du fichier de données>.TRX.
Ces fichiers peuvent être manipulés avec les outils WDTRANS ou WDOptimizer.
HFSQL Client/Serveur En HFSQL Client/Serveur, un fichier supplémentaire est créé : TRSOperationInfoClient.TRS.
Ce fichier contient les informations uniques permettant d'identifier la transaction (nom de client, poste, ...).

Identifiant du poste réalisant la transaction

Par défaut, le poste est identifié par un numéro unique interne et par le nom du poste (nom défini sous Windows).
Pour identifier simplement le poste effectuant les opérations en transaction, la fonction HPoste permet de définir un identifiant spécifique au poste. Cet identifiant remplace le nom du poste. Cet identifiant est enregistré dans le journal des opérations en transaction et peut être consulté avec WDTRANS.
HFSQL Client/Serveur L'identifiant du poste est composé du :
  • Nom de l'ordinateur et son adresse IP.
  • Nom de l'application, c'est-à-dire NomExécutable(NomProjet).

Transactions et contexte HFSQL indépendant

Lors de la copie de contexte, si une transaction est en cours sur le premier contexte, le nouveau contexte n'est pas en transaction. Il faut rappeler la fonction HTransactionDébut (ou la fonction HTransaction) pour démarrer une transaction dans le nouveau contexte.
Liste des exemples associés :
WD Transaction Exemples didactiques (WINDEV) : WD Transaction
[ + ] Ce programme réalisé avec WINDEV est basé sur une analyse simplifiée du type COMMANDE, LIGNECOMMANDE, STOCK. Il illustre le fonctionnement des transactions lors du passage d'une commande.
Version minimum requise
  • Version 9
Documentation également disponible pour…
Commentaires
Cliquez sur [Ajouter] pour publier un commentaire

Dernière modification : 08/09/2023

Signaler une erreur ou faire une suggestion | Aide en ligne locale