LOCK TABLES and UNLOCK TABLES

You are viewing an old version of this article. View the current version here.

Syntax

LOCK TABLE[S]
    tbl_name [[AS] alias] lock_type
    [, tbl_name [[AS] alias] lock_type] ...
    [WAIT n|NOWAIT]

lock_type:
    READ [LOCAL]
  | [LOW_PRIORITY] WRITE
  | WRITE CONCURRENT

UNLOCK TABLES

Description

The lock_type can be one of:

OptionDescription
READLecture verrouillée, aucune écriture autorisée
READ LOCALLecture verrouillée, mais permis pour concurrent inserts
WRITEVerrouillage d'écriture exclusif. Aucune autre connexion ne peut lire ou écrire dans cette table
LOW_PRIORITY WRITEVerrou d'écriture exclusif, mais autorise de nouveaux verrous de lecture sur la table jusqu'à ce que nous obtenions le verrou en écriture.
WRITE CONCURRENTVerrou d'écriture exclusif, mais autorise les verrous READ LOCAL sur la table..

MariaDB permet aux sessions client d'acquérir des verrous de table explicitement dans le but de coopérer avec d'autres sessions pour accéder aux tables, ou empêcher d'autres sessions de modifier des tables pendant les périodes où une session nécessite un accès exclusif. Une session peut acquérir ou libérer les verrous uniquement pour lui-même. Une session ne peut pas acquérir de verrous pour une autre session ou des verrous de publication détenus par une autre session.

Les verrous peuvent être utilisés pour émuler des transactions ou pour accélérer la vitesse de mise à jour des tables.

LOCK TABLES acquiert explicitement des verrous de table pour la session client en cours. Les verrous de table peuvent être acquis pour les tables de base ou les vues. Pour utiliser LOCK TABLES , vous devez avoir le privilège LOCK TABLES et le privilège SELECT chaque objet à verrouiller. Voir GRANT

Pour le verrouillage de vue, LOCK TABLES ajoute toutes les tables de base utilisées dans la vue aux ensembles de tables à verrouiller et les verrouillent automatiquement. Si vous verrouillez une table explicitement avec LOCK TABLES, toutes les tables utilisées dans les déclencheurs sont également verrouillées implicitement, comme décrit dans Triggers and Implicit Locks.

UNLOCK TABLES libère explicitement les verrous de table détenus par le session actuelle.

Une autre utilisation pour UNLOCK TABLES est de libérer le verrou de lecture globale acquise avec la déclaration FLUSH TABLES WITH READ LOCK, qui vous permet de verrouiller toutes les tables dans toutes les bases de données. Voir FLUSH. (C'est un moyen très pratique d'obtenir des sauvegardes si vous avez un système tel que Veritas pour prendre des Snapshots à temps..)

MariaDB starting with 10.3.0

WAIT/NOWAIT

Définir le délai d'attente de verrouillage. Voir WAIT and NOWAIT.

Limitations

LOCK TABLES ne fonctionne pas lorsque vous utilisez Galera cluster. Vous pouvez rencontrer des blocages ou des verrous lorsque vous utilisez Galera.

LOCK TABLES fonctionne uniquement sur les tables XtraDB / InnoDB si la variable système innodb_table_locks est définie sur 1 et autocommit est défini sur 0 (le défaut dans les deux cas). Veuillez noter qu'aucun message d'erreur ne sera retourné sur LOCK TABLES avec innodb_table_locks = 0.

LOCK TABLES implicitly commits la transaction active, le cas échéant. En outre, le lancement d'une transaction libère toujours tous les verrous de table acquis avec LOCK TABLES. Cela signifie qu'il n'y a aucun moyen d'avoir des verrous de table et une transaction active en même temps. Les seules exceptions sont les transactions dans le mode autocommit. Pour préserver l'intégrité des données entre les tables transactionnelles et non-transactionnelles, la fonction GET_LOCK () peut être utilisée.

Lorsqu'une connexion contient un verrou de lecture explicite sur une table, elle ne peut pas le modifier. Si vous essayez, l'erreur suivante sera produite:

ERROR 1099 (HY000): Table 'tab_name' was locked with a READ lock and can't be updated

Lorsqu'une connexion contient un verrou explicite sur une table, elle ne peut pas accéder à une table non verrouillée. Si vous essayez, l'erreur suivante sera produite:

ERROR 1100 (HY000): Table 'tab_name' was not locked with LOCK TABLES

Lorsqu'une connexion contient un verrou explicite sur une table, elle ne peut pas émettre ce qui suit: INSERT DELAYED, CREATE TABLE, CREATE TABLE ... LIKE, and DDL des instructions impliquant des programmes et des vues stockés (à l'exception des déclencheurs). Si vous essayez, l'erreur suivante sera produite:

ERROR 1192 (HY000): Can't execute the given command because you have active locked tables or an active transaction

LOCK TABLES ne peut pas être utilisé dans les routines stockées - si vous essayez, l'erreur suivante sera produite lors de la création:

ERROR 1314 (0A000): LOCK is not allowed in stored procedures

Comments

Comments loading...
Content reproduced on this site is the property of its respective owners, and this content is not reviewed in advance by MariaDB. The views, information and opinions expressed by this content do not necessarily represent those of MariaDB or any other party.