Verrouillage d'enregistrements

4D - Documentation   Français   English   German   Español   Japanese   4D v11 SQL, Commandes par thèmes   4D v11 SQL, Liste alphabétique des commandes   4D v11 SQL, Constantes par thèmes   Retour   Précédent   Suivant

version 11 (Modifiée)


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 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. 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.

Enregistrements verrouillés


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. 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).

Etats Lecture seulement et Lecture/écriture


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.

Etat lecture seulement

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.

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, 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.

Etat lecture/écriture

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é.

Changer l'état d'une table

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.

Charger, modifier et libérer des enregistrements


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 — influe sur l'état 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, tout enregistrement chargé de cette table est verrouillé. Un enregistrement verrouillé ne peut être sauvegardé ou supprimé depuis un autre process. Le mode lecture seulement est le mode recommandé puisqu'il autorise les autres utilisateurs à charger, modifier, et ensuite sauvegarder l'enregistrement.

Lorsqu'une table est en mode lecture/écriture, tout enregistrement chargé de cette table est déverrouillé seulement si aucun autre utilisateur ne l'a préalablement verrouillé. Un enregistrement déverrouillé peut être modifié et sauvegardé. Une table doit être placée en mode lecture/écriture avant qu'on ait besoin de charger, modifier et sauvegarder l'enregistrement.

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.

Boucles pour charger des enregistrements non verrouillés


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;$Machine;$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)

Comportement des commandes en cas d'enregistrement verrouillé


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.

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. Pour plus d'informations sur les ensembles, reportez-vous à la section Présentation des ensembles.

Référence

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


4D - Documentation   Français   English   German   Español   Japanese   4D v11 SQL, Commandes par thèmes   4D v11 SQL, Liste alphabétique des commandes   4D v11 SQL, Constantes par thèmes   Retour   Précédent   Suivant