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 CREATE RECORD et ADD RECORD 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 ARRAY TO 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 DISPLAY SELECTION, DISTINCT VALUES, EXPORT DIF, EXPORT SYLK, EXPORT TEXT_o_GRAPH TABLE, PRINT SELECTION, PRINT LABEL, QR REPORT, SELECTION TO ARRAY, SELECTION RANGE TO ARRAY.

Vous pouvez connaître à tout moment l'état d'une table à l'aide de la fonction Read only state.

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 CREATE RECORD ou ADD RECORD.

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 READ ONLY et READ WRITE 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 READ ONLY et READ WRITE.

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 READ ONLY, 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 NEXT RECORD, QUERY, ORDER BY, RELATE ONE, 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 Locked pour tester s'il est ou non verrouillé par un autre utilisateur. Si l'enregistrement est verrouillé (Locked retourne Vrai), chargez l'enregistrement avec la commande LOAD RECORD et testez de nouveau le verrouillage. Répétez l'opération jusqu'à ce que l'enregistrement soit libéré (Locked 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 UNLOAD RECORD. 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 UNLOAD RECORD 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 UNLOAD RECORD 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 LOCKED BY 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 READ ONLY(*)) 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é :

 READ WRITE([Clients]) ` Placer la table en lecture/écriture
 Repeat ` Boucler jusqu'à ce que l'enregistrement soit déverrouillé
    LOAD RECORD([Clients]) ` Charger et verrouiller l'enregistrement
 Until(Not(Locked([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 :

 READ WRITE([Stocks])
 Repeat ` Boucle jusqu'à ce que l'enregistrement soit déverrouillé
    LOAD RECORD([Stocks]` Charger l'enregistrement et le verrouiller
 Until(Not(Locked([Stocks])))
 [Stocks]Part Qté :=[Stocks]Part Qté 1  ` Modifier l'enregistrement
 SAVE RECORD([Stocks]` Sauvegarder l'enregistrement
 UNLOAD RECORD([Stocks]` Laisser d'autres utilisateurs le modifier
 READ ONLY([Stocks])

La commande MODIFY RECORD 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 Locked. 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 :

 Repeat
    READ ONLY([Commandes]) ` Vous n'avez pas besoin de lecture/écriture pour le moment
    QUERY([Commandes])
  ` Si la recherche est terminée et que des enregistrements sont retournés
    If((OK=1) & (Records in selection([Commandes])>0))
       READ WRITE([Commandes]) ` Mettre la table en mode lecture/écriture
       LOAD RECORD([Commandes])
       While(Locked([Commandes]) & (OK=1))
  ` Si l'enregistrement est verrouillé,
  ` boucler jusqu'à ce que l'enregistrement soit libéré
  ` Par qui l'enregistrement est-il verrouillé ?
          LOCKED ATTRIBUTES([Commandes];$Process;$Utilisateur;$Machine;$Nom)
          If($Process=-1) ` L'enregistrement a-t-il été détruit?
             ALERT("L'enregistrement a été détruit dans l'intervalle.")
             OK:=0
          Else
             If($Utilisateur="") ` Etes en mode simple utilisateur ?
                $Utilisateur:="vous-même"
             End if
             CONFIRM("L'enregistrement est utilisé par "+$Utilisateur+" dans le "+$Nom+" Process.")
             If(OK=1) ` Si vous voulez attendre quelques secondes
                DELAY PROCESS(Current process;120) `Attente
                LOAD RECORD([Commandes]) ` Essayez de charger l'enregistrement
             End if
          End if
       End while
       If(OK=1) ` L'enregistrement est libéré
          MODIFY RECORD([Commandes]) ` Vous pouvez modifier l'enregistrement
          UNLOAD RECORD([Commandes])
       End if
       READ ONLY([Commandes]) ` Retour à lecture seulement
       OK:=1
    End if
 Until(OK=0)

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

  • MODIFY RECORD : 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.
  • MODIFY SELECTION : Cette commande se comporte normalement à ceci près que lorsque l'utilisateur double-clique sur un enregistrement pour le modifier, MODIFY SELECTION affiche une boîte de dialogue indiquant que l'enregistrement est utilisé et n'autorise que sa lecture.
  • APPLY TO SELECTION : Cette commande charge un enregistrement verrouillé, mais ne le modifie pas. APPLY TO 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.
  • DELETE SELECTION : Cette commande ne supprime pas l'enregistrement verrouillé, elle l'ignore simplement. L'enregistrement verrouillé est placé dans l'ensemble LockedSet.
  • DELETE RECORD : 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.
  • SAVE RECORD : 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.
  • ARRAY TO SELECTION : Cette commande ne sauvegarde pas les enregistrements verrouillés. Si elle rencontre un enregistrement verrouillé, celui-ci est placé dans l'ensemble LockedSet.
  • GOTO RECORD : 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  

LOAD RECORD
Locked
LOCKED BY
Méthodes
READ ONLY
Read only state
READ WRITE
UNLOAD RECORD
Variables

 
PROPRIÉTÉS 

Produit : 4D
Thème : Enregistrements (verrouillage)

 
HISTORIQUE 

 
UTILISATION DE L'ARTICLE

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