LOCK |
Lockpermet de verrouiller soit un symbole, soit un fichier.
SYNTAXE 1
Lockliste_classe [ Withlokwait = exp_num]
SYNTAXE 2
Lockliste_symb [ Withlokwait = exp_num]
Elément | Description | Restrictions |
Liste de | Aucune. | |
classe : pour verrouiller la totalité d'une table | classe désigne l'abréviation d'une table ouverte. | |
Liste de | Aucune. | |
pour verrouiller un symbole désigné sous forme : | Aucune | |
nom_de_variable. | Aucune. | |
Expression alphanumérique dont la résultat est un nom_de_variable. | Aucune. | |
nom d'un serveur de tables | Aucune. | |
nom_de_variable. | Aucune. | |
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 Withlockwait = 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
LockFUNSTOACC 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.
La syntaxe avec "With lockwait = " permet 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 |
1Lock attente car BB est verrouillé par B | 2Lock attente car AA est verrouillé par A |
L'instruction Lockpermet de verrouiller globalement un fichier; le verrouillage d'unenregistrement seulement se fait par l'instruction Readlock ou par une boucleFor avec l'option With Lock.
L'instruction "Lockfichier" va échouer sur un poste (fstat vaut 1) si le même "Lockfichier" 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.
ERCLAS( 7) | L'abréviationfichier donnée ne correspond pas à un fichier actuellement ouvert. |
ERMODE(10) | expr_cn'est pas alphanumérique. |
FISLOCK(43) | Plusde verrous disponibles. |
UNLOCK - READLOCK - FOR - FSTAT - TRBEGIN- ROLLBACK - COMMIT - ADXTLK
Adonix X3(r) L4G |