Utilice el comando LOCK TABLE para bloquear una tabla en la base de datos actual. La modalidad de bloqueo especifica el tipo de bloqueo que se va a adquirir.
El comando LOCK TABLE tiene éxito cuando se puede adquirir un bloqueo de la modalidad especificada en la tabla. El comando esperará todo lo necesario para obtener el bloqueo, a menos que se especifique la opción NOWAIT, que hace que el comando anule la transacción si no puede adquirir el bloqueo inmediatamente.
Un bloqueo se mantiene hasta que se confirma la transacción o se anula. Si se emite LOCK TABLE implícitamente (es decir, no es un par BEGIN/COMMIT), el comando adquiere el bloqueo cuando se permite y, a continuación, se libera el bloqueo inmediatamente ya que el comando era una transacción de una sola sentencia que se confirma implícitamente cuando se completa el comando.
Cuando sea posible, los comandos LOCK TABLE deben emitirse antes de cualquier consulta en la transacción. La adquisición de un bloqueo después de emitir una consulta en las tablas de usuario no protege necesariamente a una transacción de errores de serialización.
Si planea emitir comandos LOCK TABLE para varias tablas de una transacción, emita los comandos en el orden establecido por la aplicación. Esto minimiza la posibilidad de punto muerto. Cuando se produce un punto muerto, Postgres anula una de las transacciones implicadas en el punto muerto.
La tabla siguiente muestra la matriz de conflictos de bloqueo; es decir, qué bloqueos pueden bloquear otros tipos de bloqueos. Una modalidad de bloqueo entra en conflicto con otra modalidad si no se puede otorgar ningún bloqueo a una transacción cuando otra transacción retiene el bloqueo opuesto en la misma tabla. Los bloqueos retenidos en la misma transacción no entran en conflicto unos con otros; una transacción puede retener bloqueos de varias modalidades en una misma tabla. Si se han de adquirir varios bloqueos en la misma tabla, solicite primero los bloqueos más fuertes para minimizar la posibilidad de que haya un punto muerto. Si una transacción necesita dos bloqueos para la misma tabla y ninguno debe ser más fuerte que el otro (en particular, SHARE y ROW EXCLUSIVE), piense en emplear una modalidad de bloqueo que subsume ambas, como SHARE ROW EXCLUSIVE.
| Unidad compartida de acceso | Unidad compartida de fila | Fila exclusiva | Unidad compartida | Unidad compartida de fila exclusiva | Exclusiva | Acceso exclusivo | |
|---|---|---|---|---|---|---|---|
| Unidad compartida de acceso | Correcto | Correcto | Correcto | Correcto | Correcto | Correcto | Conflicto |
| Unidad compartida de fila | Correcto | Correcto | Correcto | Correcto | Correcto | Conflicto | Conflicto |
| Fila exclusiva | Correcto | Correcto | Correcto | Conflicto | Conflicto | Conflicto | Conflicto |
| Unidad compartida | Correcto | Correcto | Conflicto | Correcto | Conflicto | Conflicto | Conflicto |
| Unidad compartida de fila exclusiva | Correcto | Correcto | Conflicto | Conflicto | Conflicto | Conflicto | Conflicto |
| Exclusivo | Correcto | Conflicto | Conflicto | Conflicto | Conflicto | Conflicto | Conflicto |
| Acceso exclusivo | Conflicto | Conflicto | Conflicto | Conflicto | Conflicto | Conflicto | Conflicto |
LOCK TABLE <table> in <lockmode> MODE [ NOWAIT ]
El comando LOCK TABLE toma las siguientes entradas:
| Entrada | Descripción |
|---|---|
| <table> | Nombre de la tabla que se va a bloquear. |
| <lockmode> | Tipo de bloqueo que adquirir en la tabla (consulte Tabla 3). La palabra ROW en una modalidad de bloqueo no implica un bloqueo en nivel de fila;. |
| NOWAIT | El comando devolverá un error y anulará la transacción si no puede adquirir el bloqueo solicitado inmediatamente. |
| Modalidad de bloqueo | Adquirido por | Privilegios necesarios | Nota |
|---|---|---|---|
| ACCESS SHARE | SELECT | Select | Esta es la modalidad de bloqueo más débil. Varias transacciones pueden retener esta clase de bloqueo en una tabla. |
| ROW SHARE | Insert, Delete o Update. | Varias transacciones pueden retener esta clase de bloqueo en una tabla. | |
| ROW EXCLUSIVE | INSERT, DELETE y UPDATE | Insert, Delete o Update. | Varias transacciones pueden retener esta clase de bloqueo en una tabla. |
| SHARE | CREATE MATERIALIZED VIEW y GENERATE STATISTICS | Select o Genstats | Varias transacciones pueden retener esta clase de bloqueo en una tabla. |
| SHARE ROW EXCLUSIVE | Insert, Delete o Update. | ||
| EXCLUSIVE | Insert, Delete o Update. | ||
| ACCESS EXCLUSIVE | DROP TABLE, ALTER TABLE y TRUNCATE TABLE | Drop, Alter o Truncate |
El comando LOCK TABLE tiene la siguiente salida:
| Salida | Descripción |
|---|---|
| LOCK TABLE | El comando se ha ejecutado correctamente. |
| NOTICE: LOCK TABLE issued after query against user tables | Si se ha emitido un LOCK TABLE después de que la transacción ha emitido una consulta en las tablas de usuario, el sistema muestra un mensaje NOTICE y el comando tiene éxito cuando puede adquirir el bloqueo solicitado. |
Es necesario ser el usuario administrativo, el propietario de la tabla o el propietario de la base de datos o del esquema donde se define la tabla, o la cuenta debe tener los privilegios de objeto adecuados, tal y como se describe en Tabla 3.
LOCK TABLE customers IN ROW EXCLUSIVE MODE;