GET_LOCK
Syntax
GET_LOCK(str,timeout)
Description
Essaie d'obtenir un verrou avec un nom donné par la chaîne str
, en utilisant un timeout de timeout
secondes. Renvoie 1
si le verrou a été obtenu avec succès, 0
si la tentative a expiré (par exemple, parce qu'un autre client a déjà verrouillé le nom) , ou NULL
si une erreur est survenue (comme un manque de mémoire ou si le thread a été tué avec mysqladmin kill).
Si vous avez un verrou obtenu avec GET_LOCK ()
, il est libéré lorsque vous exécutez RELEASE_LOCK (), exécutez un nouveau GET_LOCK ()
, ou votre connexion se termine (normalement ou anormalement). Les verrous obtenus avec GET_LOCK ()
n'interagissent pas avec les transactions. C'est-à-dire que la validation d'une transaction ne libère aucun de ces verrous obtenus pendant la transaction.
MariaDB starting with 10.0.2
Konstantin "Kostja" Osipov
contributed a patch (MDEV-3917)lequel
permet à un utilisateur de définir de nombreux verrous au niveau de l'utilisateur dans une connexion avec le
GET_LOCK ()
appel. Si un blocage est détecté, GET_LOCK ()
renvoie une erreur. Si un verrou n'est plus nécessaire, souvenez-vous de release avant d'appeler à nouveau GET_LOCK ()
.
MariaDB starting with 10.1.2
A partir de MariaDB 10.1.2, GET_LOCK() prend en charge les microsecondes dans le délai d'attente, les fractions arrondies n'étant plus arrondies à l'entier le plus proche. (MDEV-4018)
Notes
str
est insensible à la casse pour GET_LOCK()
et fonctions connexes. Sistr
est une chaîne vide ouNULL
, GET_LOCK()
renvoie NULL
et ne fait rien timeout
est arrondi à l'entier le plus proche.
Si le metadata_lock_info plugin est installé, les verrous acquis avec cette fonction sont visibles dans la table Information Schema METADATA_LOCK_INFO.
Cette fonction peut être utilisée pour implémenter des verrous d'application ou pour simuler des enregistrements de verrous. Les noms sont verrouillés sur l'ensemble du serveur. Si un nom a été verrouillé par un client, GET_LOCK ()
bloque toute requête d'un autre client pour un verrou avec le même nom.
Cela permet aux clients qui sont d'accord sur un nom de verrou donné, d'utiliser le nom pour effectuer un verrouillage de conseil coopératif. Mais sachez que cela permet également à un client qui ne fait pas partie de l'ensemble des clients verrouiller par un nom, soit par inadvertance ou délibérément, et empêcher ainsi l'un des clients coopérants de verrouiller ce nom. Une façon de réduire la probabilité est d'utiliser des noms de verrous spécifiques à la base de données ou à l'application.
Par exemple, utilisez les noms de verrous de la forme db_name.str
ou app_name.str
.
Les instructions utilisant la fonction GET_LOCK () ne sont pas safe for replication.
Exemples
SELECT GET_LOCK('lock1',10)\G *************************** 1. row *************************** GET_LOCK('lock1',10): 1 SELECT IS_FREE_LOCK('lock2')\G *************************** 1. row *************************** IS_FREE_LOCK('lock2'): 1 SELECT GET_LOCK('lock2',10)\G *************************** 1. row *************************** GET_LOCK('lock2',10): 1 SELECT RELEASE_LOCK('lock2')\G *************************** 1. row *************************** RELEASE_LOCK('lock2'): 1 SELECT RELEASE_LOCK('lock1')\G *************************** 1. row *************************** RELEASE_LOCK('lock1'): NULL