4D v16.3

Suspendre des transactions

Accueil

 
4D v16.3
Suspendre des transactions

Suspendre des transactions  


 

Suspendre une transaction est utile notamment lorsque vous devez, depuis une transaction, lancer certaines opérations qui n'ont pas besoin d'être effectuées sous le contrôle de cette transaction. Par exemple, imaginez le cas d'un client qui passe une commande, donc via une transaction, et qui en profite pour mettre à jour son adresse postale. Finalement, le client se ravise et annule sa commande. La transaction est annulée, mais pour autant vous ne souhaitez pas que la mise à jour de l'adresse le soit également. Ce cas peut typiquement être géré via la suspension de la transaction. Trois commandes permettent de gérer la suspension et la réactivation des transactions :

  • SUSPENDRE TRANSACTION : suspend la transaction courante. Tous les enregistrements en cours de mise à jour ou de création restent verrouillés.
  • REACTIVER TRANSACTION : réactive une transaction suspendue, le cas échéant.
  • Transaction active : retourne Faux si la transaction courante est suspendue ou s'il n'y a pas de transaction courante, et Vrai si elle est démarrée ou réactivée.

Exemple  

Cet exemple présente un cas typique où la suspension d'une transaction est utile. Dans une base de facturation (Invoices), nous voulons obtenir un nouveau numéro de facture durant une transaction. Ce numéro est calculé et stocké dans une table [Settings]. Dans un environnement multi-utilisateur, les accès doivent être protégés ; cependant, à cause de la transaction, la table [Settings] pourrait être verrouillée par un autre utilisateur alors même que ses données ne dépendent pas de la transaction principale. Dans ce cas, vous pouvez suspendre la transaction pour l'accès à la table.

  //Méthode standard qui crée une facture
 DEBUT TRANSACTION
 ...
 CREER ENREGISTREMENT([Invoices])
 [Invoices]InvoiceID:=GetInvoiceNum //appel de la méthode pour obtenir un numéro disponible
 ...
 STOCKER ENREGISTREMENT([Invoices])
 VALIDER TRANSACTION

La méthode GetInvoiceNum suspend la transaction avant de s'exécuter. A noter que ce code fonctionnera même si la méthode est appelée en-dehors de toute transaction :

  //Méthode projet GetInvoiceNum
  //GetInvoiceNum -> prochain numéro de facture disponible
 C_ENTIER LONG($0)
 SUSPENDRE TRANSACTION
 TOUT SELECTIONNER([Settings])
 Si(Enregistrement verrouille([Settings])) //accès multi-utilisateur
    Tant que(Enregistrement verrouille([Settings]))
       MESSAGE("Attente d'enregistrement Settings verrouillé")
       ENDORMIR PROCESS(Numero du process courant;30)
       CHARGER ENREGISTREMENT([Settings])
    Fin tant que
 Fin de si
 [Settings]InvoiceNum:=[Settings]InvoiceNum+1
 $0:=[Settings]InvoiceNum
 STOCKER ENREGISTREMENT([Settings])
 LIBERER ENREGISTREMENT([Settings])
 REACTIVER TRANSACTION

Lorsqu'une transaction est suspendue, les principes de fonctionnement suivants s'appliquent :

  • Vous pouvez accéder aux enregistrements qui ont été ajoutés ou modifiés durant la transaction, et vous ne pouvez pas accéder aux enregistrements qui ont été supprimés durant la transaction.
  • Vous pouvez créer, sauvegarder, supprimer ou modifier des enregistrements en-dehors de la transaction.
  • Vous pouvez démarrer une nouvelle transaction, mais à l'intérieur de cette transaction incluse, vous ne pourrez pas voir les enregistrements ou les valeurs d'enregistrements qui auront été modifié(s) ou ajouté(e)s dans la transaction suspendue. En fait, cette nouvelle transaction est totalement indépendante de celle qui a été suspendue, comme s'il s'agissait d'une transaction dans un autre process, et puisque la transaction suspendue pourra être par la suite validée ou annulée, tout enregistrement modifié ou annulé est automatiquement masqué pour la nouvelle transaction. Dès que vous validerez ou annulerez cette nouvelle transaction, vous pourrez à nouveau accéder à ces enregistrements. 
  • Tous les enregistrements modifiés, supprimés ou ajoutés à l'intérieur de la transaction suspendue restent verrouillés pour les autres process. If vous tentez de modifier ou de supprimer ces enregistrements hors de la transaction ou dans une autre transaction, une erreur est générée.

Ces principes sont résumés dans le schéma suivant :

Les valeurs modifiées durant la transaction A (enregistrement ID1 prend la valeur Val11) ne sont pas disponibles dans une nouvelle transaction (B) créée pendant la période de suspension. Les valeurs modifiées durant la période de suspension (enregistrement ID2 prend la valeur Val22 et enregistrement ID3 prend la valeur Val33) sont sauvegardées même après que la transaction A a été annulée.

Des fonctionnalités spécifiques ont été ajoutées pour prendre en charge les erreurs :

  • L'enregistrement courant de chaque table devient temporairement verrouillé s'il est modifié pendant la transaction et est automatiquement déverrouillé lorsque la transaction est réactivée. Ce mécanisme est important pour empêcher que des parties de la transaction soient sauvegardées de manière impromptue.
  • Si vous exécutez une séquence invalide telle que débuter transaction / suspendre transaction / débuter transaction / réactiver transaction, une erreur est générée. Ce mécanisme prévient tout éventuel oubli de valider ou d'annuler des sous-transactions incluses avant de réactiver une transaction suspendue.

La commande existante Transaction en cours retourne Vrai dès qu'une transaction a été démarrée, même si elle a été suspendue. Pour savoir si la transaction courante a été suspendue, vous devez utiliser la nouvelle commande Transaction active, qui retourne Faux dans ce cas. 

Ces deux commandes, cependant, retournent également Faux si aucune transaction n'a été démarrée. Vous pourrez alors avoir besoin d'utiliser la commande existante Niveau de la transaction, qui retourne 0 dans ce contexte (pas de transaction démarrée).

Le schéma suivant illustre les différents contextes de transaction et les valeurs correspondantes retournées par les commandes de transaction :




Voir aussi  


REACTIVER TRANSACTION
SUSPENDRE TRANSACTION
Transaction active

 
PROPRIÉTÉS 

Produit : 4D
Thème : Transactions
Nom intl. : Suspending transactions

 
HISTORIQUE 

Créé : 4D v15 R4

 
UTILISATION DE L'ARTICLE

4D - Langage ( 4D v16)
4D - Langage ( 4D v16.1)
4D - Langage ( 4D v16.2)
4D - Langage ( 4D v16.3)