4D v16.3

Verrouillage d'enregistrements

Accueil

 
4D v16.3
Verrouillage d'enregistrements

Verrouillage d'enregistrements  


 

 

4D et 4D Server gèrent automatiquement les bases en empêchant les conflits entre les process ou entre les utilisateurs. Deux utilisateurs ou deux process ne peuvent pas modifier en même temps le même enregistrement ou le même objet. Le second utilisateur ou process peut toutefois accéder simultanément en "lecture seulement" à l'enregistrement ou à l'objet.

Vous devez utiliser les commandes multi-utilisateurs de cette section dans plusieurs cas :

  •  Modification d'enregistrements par programmation,
  •  Utilisation d'une interface utilisateur personnalisée pour les opérations multi-utilisateurs,
  •  Sauvegarde de modifications reliées entre elles dans une transaction.

Il y a trois concepts importants à maîtriser lorsqu'on utilise des commandes dans une base multi-process :

  1. Dans un process, chaque table est soit en mode "lecture seulement" soit en mode "lecture/écriture".
  2. Les enregistrements sont verrouillés quand ils sont chargés et déverrouillés quand ils sont libérés.
  3. Un enregistrement verrouillé ne peut être modifié.

Dans les paragraphes suivants, la personne effectuant une opération dans la base multi-utilisateurs est l'utilisateur local. Les autres personnes utilisant la base sont appelées les autres utilisateurs. La discussion est menée du point de vue de l'utilisateur local. De même, du point de vue du multi-process, le process exécutant une opération dans la base est le process courant. Tout autre process en cours d'exécution est désigné comme un autre process. La discussion est menée du point de vue du process courant.

Un enregistrement verrouillé ne peut pas être modifié par l'utilisateur local ou le process courant. Un enregistrement verrouillé peut être chargé, mais pas modifié. Un enregistrement est verrouillé quand l'un des autres utilisateurs ou process a chargé l'enregistrement pour effectuer une modification ou quand l'enregistrement est empilé. Seul l'utilisateur qui modifie l'enregistrement perçoit l'enregistrement comme étant non verrouillé. Tous les autres utilisateurs et process perçoivent l'enregistrement comme étant verrouillé, et donc indisponible pour modification. Une table doit être en mode lecture/écriture pour qu'un enregistrement puisse être chargé déverrouillé (modifiable).

Chaque table d'une base est soit en mode lecture/écriture, soit en mode lecture seulement pour chaque utilisateur et process de la base. Lecture seulement signifie que les enregistrements de la table peuvent être chargés mais non modifiés. Lecture/écriture signifie que les enregistrements de la table peuvent être chargés et modifiés par un utilisateur/process, si aucun autre utilisateur/process n'a prélablement verrouillé l'enregistrement.

Notez que si vous changez l'état d'une table, celui-ci prend effet pour le prochain enregistrement chargé. Si un enregistrement est déjà chargé, la modification de l'état de la table ne l'affecte pas.

Lorsqu'une table est en lecture seulement et qu'un enregistrement est chargé, l'enregistrement est toujours verrouillé. En d'autres termes, l'enregistrement peut être affiché, imprimé et utilisé de diverses façons, mais ne peut être modifié.

Notez que le mode lecture seulement ne s'applique qu'à la modification d'enregistrements existants. Le mode lecture seulement n'affecte pas la création de nouveaux enregistrements : vous pouvez toujours ajouter des enregistrements à une table en lecture seulement en utilisant les commandes CREER ENREGISTREMENT et AJOUTER ENREGISTREMENT ou les commandes de menu du mode Développement (dans ce cas les enregistrements en cours de création sont verrouillés pour les autres process/utilisateurs). A noter que la commande TABLEAU VERS SELECTION n'est pas affectée par le mode lecture seulement car elle permet aussi bien de créer que de modifier des enregistrements.

4D met automatiquement une table en mode lecture seulement pour les commandes qui ne requièrent pas d'accès en écriture aux enregistrements. Ces commandes sont VISUALISER SELECTION, VALEURS DISTINCTES, ECRITURE DIF, ECRITURE SYLK, EXPORTER TEXTE_o_GRAPHE SUR SELECTION, IMPRIMER SELECTION, IMPRIMER ETIQUETTES, QR ETAT, SELECTION VERS TABLEAU, SELECTION LIMITEE VERS TABLEAU.

Vous pouvez connaître à tout moment l'état d'une table à l'aide de la fonction Etat lecture seulement.

Avant d'exécuter ces commandes, 4D sauvegarde l'état courant de la table (lecture seulement ou lecture/écriture) dans le process courant. Une fois la commande exécutée, l'état initial est rétabli.

Lorsqu'une table est en lecture/écriture et qu'un enregistrement est chargé, l'enregistrement sera non verrouillé si aucun autre utilisateur ne l'a préalablement chargé. Si l'enregistrement est verrouillé par un autre utilisateur, l'enregistrement est chargé verrouillé et ne peut être modifié par l'utilisateur local.

Une table doit être en mode lecture/écriture et l'enregistrement doit être chargé pour qu'il soit déverrouillé et donc modifiable.

Si un utilisateur charge un enregistrement d'une table en mode lecture/écriture, aucun autre utilisateur ne peut charger cet enregistrement pour modification. Les autres utilisateurs peuvent toujours, cependant, ajouter des enregistrements dans la table, soit manuellement en mode Développement, soit par les commandes CREER ENREGISTREMENT ou AJOUTER ENREGISTREMENT.

Le mode lecture/écriture est le mode par défaut pour toutes les tables quand une base est ouverte et un nouveau process démarré.

Vous pouvez utiliser les commandes LECTURE SEULEMENT et LECTURE ECRITURE pour changer l'état d'une table. Si vous voulez changer l'état d'une table pour mettre un enregistrement en lecture seulement ou lecture/écriture, vous devez exécuter la commande avant le chargement de l'enregistrement. Un enregistrement déjà chargé n'est pas affecté par les commandes LECTURE SEULEMENT et LECTURE ECRITURE.

Chaque process dispose de son propre état (lecture seulement ou lecture/écriture) pour chaque table dans la base.

Par défaut, si vous n'utilisez pas la commande LECTURE SEULEMENT, toutes les tables sont en mode lecture/écriture.

Pour que l'utilisateur local puisse modifier un enregistrement, la table doit être en mode lecture/écriture et l'enregistrement doit être chargé et non verrouillé.

Chacune des commandes chargeant un enregistrement courant (s'il y en a un) — telles que ENREGISTREMENT SUIVANT, CHERCHER, TRIER, CHARGER SUR LIEN, etc — définit l'état verrouillé ou non verrouillé de l'enregistrement. L'enregistrement est chargé en fonction de l'état courant de sa table (lecture seulement ou lecture/écriture) et sa propre disponibilité. Un enregistrement peut aussi être chargé d'une table liée par une commande activant le lien automatique.

Lorsqu'une table est en mode lecture seulement pour un process ou un utilisateur, tout enregistrement de cette table est chargé en mode lecture seulement, ce qui signifie qu'il ne pourra pas être modifié ou supprimé par ce process ou utilisateur. Ce mode est recommandé pour la visualisation et la recherche de données car il n'empêche pas les autres process ou utilisateurs d'accéder en mode lecture/écriture aux enregistrements de la table si nécessaire.

Lorsqu'une table est en mode lecture/écriture pour un process ou un utilisateur, tout enregistrement de cette table est chargé en mode lecture/écriture à condition qu'aucun autre process ou utilisateur ne l'ait préalablement verrouillé. Si l'enregistrement a pu être chargé en lecture/écriture, il est déverrouillé pour le process ou utilisateur courant (il peut être modifié et sauvegardé) et il est verrouillé pour les autres process ou utilisateurs. Une table doit être placée en mode lecture/écriture par le process/utilisateur avant tout chargement d'un enregistrement pour modification et sauvegarde.

Si un enregistrement doit être modifié, utilisez la fonction Enregistrement verrouille pour tester s'il est ou non verrouillé par un autre utilisateur. Si l'enregistrement est verrouillé (Enregistrement verrouille retourne Vrai), chargez l'enregistrement avec la commande CHARGER ENREGISTREMENT et testez de nouveau le verrouillage. Répétez l'opération jusqu'à ce que l'enregistrement soit libéré (Enregistrement verrouille retourne Faux).

Lorsque vous en avez terminé avec les modifications à apporter à un enregistrement, il doit être libéré pour les autres utilisateurs (et donc déverrouillé) avec la commande LIBERER ENREGISTREMENT. Si un enregistrement n'est pas libéré, il reste verrouillé pour tous les autres utilisateurs jusqu'à ce qu'un nouvel enregistrement courant soit sélectionné. Changer l'enregistrement courant d'une table libère automatiquement l'enregistrement courant précédent. Vous devez explicitement appeler LIBERER ENREGISTREMENT si vous ne changez pas l'enregistrement courant. Ce principe ne s'applique qu'aux enregistrements existants : quand un enregistrement est créé, il peut être sauvegardé quel que soit l'état de la table auquel il appartient.

Note : Lorsqu'elle est utilisée dans une transaction, la commande LIBERER ENREGISTREMENT libère l'enregistrement courant pour le process qui gère la transaction uniquement. Pour les autres process, l'enregistrement reste verrouillé tant que la transaction n'est pas validée (ou annulée).

Utilisez la commande VERROUILLE PAR pour savoir quel utilisateur ou process a verrouillé un enregistrement.

Note : Une bonne pratique consiste à placer toutes les tables en mode lecture seulement au démarrage de chaque process (via la syntaxe LECTURE SEULEMENT(*)) puis à placer chaque table en mode lecture/écriture uniquement en cas de besoin. L'accès aux tables en mode lecture seulement est plus rapide et plus économe en mémoire. De plus, le changement d'état d'une table est optimisé en mode client/serveur car il ne provoque pas de trafic réseau supplémentaire : l'information est envoyée au serveur uniquement lors de l'exécution d'une commande nécessitant l'accès adéquat à la table.

Cet exemple présente la boucle la plus simple pour charger un enregistrement non verrouillé :

 LECTURE ECRITURE([Clients]) ` Placer la table en lecture/écriture
 Repeter ` Boucler jusqu'à ce que l'enregistrement soit déverrouillé
    CHARGER ENREGISTREMENT([Clients]) ` Charger et verrouiller l'enregistrement
 Jusque(Non(Enregistrement verrouille([Clients])))

La boucle s'exécute jusqu'à ce que l'enregistrement soit libéré.

Une boucle de ce type ne s'emploie que lorsqu'il est peu probable que l'enregistrement soit verrouillé par quelqu'un d'autre, puisque l'utilisateur aurait à attendre la fin de la boucle. Aussi, une telle boucle est rarement utilisée, sauf si l'enregistrement n'est modifiable que par méthode.

Cet exemple utilise la boucle précédente pour charger un enregistrement non verrouillé et modifier l'enregistrement :

 LECTURE ECRITURE([Stocks])
 Repeter ` Boucle jusqu'à ce que l'enregistrement soit déverrouillé
    CHARGER ENREGISTREMENT([Stocks]` Charger l'enregistrement et le verrouiller
 Jusque(Non(Enregistrement verrouille([Stocks])))
 [Stocks]Part Qté :=[Stocks]Part Qté 1  ` Modifier l'enregistrement
 STOCKER ENREGISTREMENT([Stocks]` Sauvegarder l'enregistrement
 LIBERER ENREGISTREMENT([Stocks]` Laisser d'autres utilisateurs le modifier
 LECTURE SEULEMENT([Stocks])

La commande MODIFIER ENREGISTREMENT prévient automatiquement l'utilisateur si un enregistrement est verrouillé, et interdit sa modification. L'exemple suivant évite la notification automatique par un test préalable de l'enregistrement avec la fonction Enregistrement verrouille. Si l'enregistrement est verrouillé, l'utilisateur peut annuler.

Cet exemple teste si l'enregistrement courant est verrouillé pour la table [Commandes]. Si c'est le cas, le process est endormi par la méthode pendant quelques instants. Cette technique peut être utlisée à la fois dans un développement multi-utilisateurs et multi-process :

 Repeter
    LECTURE SEULEMENT([Commandes]) ` Vous n'avez pas besoin de lecture/écriture pour le moment
    CHERCHER([Commandes])
  ` Si la recherche est terminée et que des enregistrements sont retournés
    Si((OK=1) & (Enregistrements trouves([Commandes])>0))
       LECTURE ECRITURE([Commandes]) ` Mettre la table en mode lecture/écriture
       CHARGER ENREGISTREMENT([Commandes])
       Tant que(Enregistrement verrouille([Commandes]) & (OK=1))
  ` Si l'enregistrement est verrouillé,
  ` boucler jusqu'à ce que l'enregistrement soit libéré
  ` Par qui l'enregistrement est-il verrouillé ?
          VERROUILLE PAR([Commandes];$Process;$Utilisateur;$SessionUtil;$Nom)
          Si($Process=-1) ` L'enregistrement a-t-il été détruit?
             ALERTE("L'enregistrement a été détruit dans l'intervalle.")
             OK:=0
          Sinon
             Si($Utilisateur="") ` Etes en mode simple utilisateur ?
                $Utilisateur:="vous-même"
             Fin de si
             CONFIRMER("L'enregistrement est utilisé par "+$Utilisateur+" dans le "+$Nom+" Process.")
             Si(OK=1) ` Si vous voulez attendre quelques secondes
                ENDORMIR PROCESS(Numero du process courant;120) `Attente
                CHARGER ENREGISTREMENT([Commandes]) ` Essayez de charger l'enregistrement
             Fin de si
          Fin de si
       Fin tant que
       Si(OK=1) ` L'enregistrement est libéré
          MODIFIER ENREGISTREMENT([Commandes]) ` Vous pouvez modifier l'enregistrement
          LIBERER ENREGISTREMENT([Commandes])
       Fin de si
       LECTURE SEULEMENT([Commandes]) ` Retour à lecture seulement
       OK:=1
    Fin de si
 Jusque(OK=0)

Certaines commandes du langage effectuent des actions particulières lorsqu'elles rencontrent un enregistrement verrouillé. Voici la liste de ces commandes :

  • MODIFIER ENREGISTREMENT : Cette commande affiche une boîte de dialogue indiquant que l'enregistrement est utilisé. L'enregistrement n'est pas affiché et donc l'utilisateur ne peut le modifier. En mode Développement, l'enregistrement est visible en lecture seulement.
  • MODIFIER SELECTION : Cette commande se comporte normalement à ceci près que lorsque l'utilisateur double-clique sur un enregistrement pour le modifier, MODIFIER SELECTION affiche une boîte de dialogue indiquant que l'enregistrement est utilisé et n'autorise que sa lecture.
  • APPLIQUER A SELECTION : Cette commande charge un enregistrement verrouillé, mais ne le modifie pas. APPLIQUER A SELECTION peut être utilisée pour lire les informations de la table sans problème. Si la commande rencontre un enregistrement verrouillé, celui-ci est placé dans l'ensemble système LockedSet.
  • SUPPRIMER SELECTION : Cette commande ne supprime pas l'enregistrement verrouillé, elle l'ignore simplement. L'enregistrement verrouillé est placé dans l'ensemble LockedSet.
  • SUPPRIMER ENREGISTREMENT : Cette commande est ignorée si l'enregistrement est verrouillé. Aucune erreur n'est retournée. Vous devez vous assurer que l'enregistrement est non verrouillé avant d'exécuter cette commande.
  • STOCKER ENREGISTREMENT : Cette commande est ignorée si l'enregistrement est verrouillé. Aucune erreur n'est retournée. Vous devez vous assurer que l'enregistrement est non verrouillé avant d'exécuter cette commande.
  • TABLEAU VERS SELECTION : Cette commande ne sauvegarde pas les enregistrements verrouillés. Si elle rencontre un enregistrement verrouillé, celui-ci est placé dans l'ensemble LockedSet.
  • ALLER A ENREGISTREMENT : Dans une base multi-utilisateurs/multi-process, des enregistrements peuvent être ajoutés ou supprimés par d'autres utilisateurs/process. Les numéros d'enregistrement peuvent donc varier. Soyez prudent lorsque vous référencez un enregistrement par son numéro dans une base multi-utilisateurs.
  • Présentation des ensembles : Soyez prudent lors de la manipulation d'ensembles puisque les informations sur lesquelles était basée la construction de l'ensemble peuvent avoir été modifiées par un autre utilisateur ou process.



Voir aussi  

CHARGER ENREGISTREMENT
Enregistrement verrouille
Etat lecture seulement
LECTURE ECRITURE
LECTURE SEULEMENT
LIBERER ENREGISTREMENT
Méthodes
Variables
VERROUILLE PAR

 
PROPRIÉTÉS 

Produit : 4D
Thème : Enregistrements (verrouillage)
Nom intl. : Record Locking

 
HISTORIQUE 

 
UTILISATION DE L'ARTICLE

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