Lock permet de verrouiller soit un symbole, soit un fichier.
SYNTAXE 1
Lock liste_classe [ With lockwait = exp_num ]
SYNTAXE 2
Lock liste_symb [ With lockwait = exp_num ]
Elément | Description | Restrictions |
liste_classe | Liste de classe à verrouiller, séparés par le caractère ','. | Aucune. |
classe | classe : pour verrouiller la totalité d'une table | classe désigne l'abréviation d'une table ouverte. |
liste_symb | Liste de symb à verrouiller, séparés par le caractère ','. | Aucune. |
symb | pour verrouiller un symbole désigné sous forme : | Aucune |
symbole | nom_de_variable. | Aucune. |
expr_c | Expression alphanumérique dont la résultat est un nom_de_variable. | Aucune. |
serveur | nom d'un serveur de tables | Aucune. |
application | nom_de_variable. | Aucune. |
expr_num | Expression numérique donnant le nombre de secondes d'essai | -2^31 -1 < n >2^31 |
# Verrouillage d'un symbole lié au fichier et à la clé courante.
SYMBOLE = "ABV"+num$([F:ABV]NOMCLE)
Lock = SYMBOLE With lockwait = 0
If [S]fstat : Errbox "Enregistrement verrouillé" : Endif
# Verrouillage de 3 fichiers avant de commencer
Lock [ART], [CLI], [REP]
If [S]fstat : Errbox "Fichiers déjà verrouillés " : Endif
# Contrôler qu'il n'y a pas une autre interface en cours
# Traitement FUNSTOACC exclusif
CTL_OK = 1
SYMBOLE = "FUNSTOACC"
Lock =SYMBOLE With lockwait = 0
If fstat
CTL_OK = 0
If GSERVEUR
# "Interface comptable déjà en cours"
ERR_TRA = mess(270,197,1)
Call ECR_TRACE(ERR_TRA,1) From GESECRAN
Else
Call ERREUR(mess(270,197,1)) From GESECRAN
Endif
Goto FIN_TRT
Endif
# Incrémentation du compteur pour les exports
# contenu dans la variable globale EXPORT
If [M:EXP2]CHRONO=2
Lock EXPORT
If fstat
# Modification en cours sur un autre poste
Call ECR_TRACE(mess(30,100,1),1) From GESECRAN
Return
Endif
...
Endif# Il faut une cohérence entre le Lock et le Unlock
# on a 2 façons d'écrire : soit
SYMBOLE = "FUNSTOACC"
Lock =SYMBOLE With lockwait = 0
...
Unlock =SYMBOLE
# ou soit
Lock FUNSTOACC With lockwait = 0
...
Unlock FUNSTOACC
L'instruction Lock permet de verrouiller soit des tables globalement, soit des symboles. Lorsqu'on verrouille un symbole, celui-ci ne peut être verrouillé par un autre utilisateur en même temps. Ceci permet par exemple de contrôler l'accès à un traitement, à une variable commune (compteur), etc. En cas d'insuccès, Lock réessaye tant que le nombre de secondes fixé par la variable [S]lockwait n'est pas écoulé. Il est important de faire un Unlock des tables ou des symboles, lorsqu'il n'est plus nécessaire qu'ils soient verrouillés, ceci afin de ne pas bloquer les autres utilisateurs qui voudraient y accéder.
En cas d'insuccès au bout du temps imparti, la variable système Adonix fstat vaut 1. Si les verrous ont pu être mis en place, fstat est égal à 0.
Attention ! Ne pas faire de Lock symbole dans une transaction, car dans ce cas, si le symbole est déjà verrouillé, le système ne renvoie pas de statut et reste en attente sur cette instruction.
La syntaxe avec "With lockwait = " permet à la fois de tenir compte de la variable lockwait dans cette instruction LOCK et d'également d'affecter momentanément [S]lockwait avec la valeur qui suit. Après quoi, [S]lockwait reprend sa valeur initiale.
Lorsqu'on tente de verrouiller plusieurs OBJets dans un même ordre Lock, il y a verrouillage complet de tous les OBJets; si l'un des verrous ne peut être posé, l'ensemble des OBJets est déverrouillé, et fstat est mis à 1.
Le mécanisme de verrouillage/déverrouillage global de plusieurs OBJets permet d'éviter des "étreintes fatales" (interblocage de deux programmes qui essaient de verrouiller plusieurs OBJets identiques en même temps, mais pas dans le même ordre). Un programmeur averti évitera des situations de ce genre (le chiffre écrit avant chaque instruction Lock définit leur ordre d'exécution) :
PROGRAMME A | PROGRAMME B |
1 Lock AA attente car BB est verrouillé par B | 2 Lock BB attente car AA est verrouillé par A |
L'instruction Lock permet de verrouiller globalement un fichier; le verrouillage d'un enregistrement seulement se fait par l'instruction Readlock ou par une boucle For avec l'option With Lock.
L'instruction "Lock fichier" va échouer sur un poste (fstat vaut 1) si le même "Lock fichier" ou si un enregistrement de ce fichier a déjà été verrouillé depuis un autre poste. Lorsqu'un fichier est verrouillé par l'instruction Lock, tous les verrouillages d'enregistrements demandés par d'autres postes échoueront.
Un symbole est un identificateur que l'on peut soit verrouiller avec Lock soit déverrouiller avec Unlock; ces opérations sont les seules que l'on peut réaliser sur un symbole. Un symbole ne se déclare pas (ce n'est pas une variable). Lorsque l'on utilise ce mécanisme pour contrôler l'accès à un compteur par exemple, on choisit en général un symbole de même nom que le compteur ; ceci ne signifie pas que l'on verrouille le compteur.
Ces symboles correspondent à des enregistrements d'une table spéciale dont le nom est donné par la variable [S]adxtlk. Il est possible de modifier certaines caractéristiques de cette table en les protégeant par un code activité. Ce peut être augmenter la longueur de la zone LCKSYM qui fixe le nombre maximum de caractères du nom d'un symbole. On pourrait aussi changer l'abréviation de cette table, si besoin est. Ce sont à priori les seules modifications sans danger à faire dans cette table gérée automatiquement par Adonix. Il est interdit de modifier le nom de cette table.
On peut verrouiller un symbole d'autre application. Il faudra préciser le serveur sur lequel elle se trouve si on travaille en mode client-serveur et si elle n'est pas sur le serveur courant.
Ces symboles étant propres à Adonix, ils ne peuvent donc pas protéger contre l'utilisation des tables par d'autres applicatifs.
Pour ôter un verrou mis sur un fichier, des enregistrements ou un symbole, on utilise l'instruction Unlock, les verrous système éventuellement utilisés lors du Lock étant alors libérés. Mais Unlock ne prendra effet qu'à la fin de la transaction, le cas échéant.
Un verrou mis sur fichier est automatiquement supprimé lorsque le fichier est fermé, ce qui est toujours le cas en fin de transaction.
Rollback et Commit annulent tous les verrous posés sur fichiers, ainsi que les verrous sur symboles mais seulement ceux posés depuis le début de la transaction (Trbegin).
Pour toute base de donnée, le nombre de verrous est un paramètre de la base. Si cette ressource est épuisée, une erreur Adonix n43 (FISLOCK) sera générée.
Lorsqu'on verrouille des symboles sur une application différente de l'application courante, l'instruction Unlock d'un des symboles supprime tous les verrous posés dans cette application.
Il n'est pas possible d'utiliser l'abréviation de lien pour verrouiller une table (cette abréviation existe si l'on a défini des liens sur ce fichier avec l'instruction Link).
Le verrouillage d'un symbole peut se faire en dehors d'une transaction. Mais, dans ce cas, Adonix fera alors de lui même une transaction, puisqu'il s'agit de l'écriture sur une table.
lorsque l'on verrouille un grand nombre de lignes d'une table, Sql-server pratique l'escalade des verrous afin de ne pas utiliser trop de ressources et peut verrouiller une page, voire même toute la table.