sql >> Base de Datos >  >> RDS >> Sqlserver

Administrar la simultaneidad de transacciones mediante bloqueos en SQL Server

En un entorno multiusuario, es esencial mantener la simultaneidad de truncamiento. Estos bloqueos son estructuras en memoria de 96 bytes de tamaño. Su función es mantener la integridad de los datos, la consistencia y el control de concurrencia para cada transacción. SQL Server sigue la prueba ACID para cada transacción.

  • A tomicity:esta propiedad garantiza que una transacción que involucre dos o más procesos se confirme por completo, o que no se confirme ninguno de los procesos.
  • C onsistency:Te da una garantía sobre el estado de la transacción comprometida. Una transacción debe crear un nuevo estado de datos o volver al estado existente (antes de la transacción).
  • Yo solación:Indica que las transacciones están aisladas unas de otras. Si una transacción se está ejecutando y no comprometió datos, se aísla de otras transacciones.
  • D Durabilidad:la durabilidad garantiza que sus datos comprometidos nunca se pierdan. Previene fallas de energía y del sistema operativo, u otros errores inducidos por el software.

Para garantizar las propiedades de ACID, SQL Server impone diferentes tipos de bloqueos en los objetos. En este caso, otras transacciones deben esperar hasta que se libere el bloqueo.

Modos de bloqueo

SQL Server usa los siguientes modos de bloqueo para cada transacción.

  • Bloqueos compartidos:
    • En este bloqueo, SQL Server permite que otras sesiones realicen las operaciones seleccionadas para leer datos. Sin embargo, impide las actualizaciones hasta que el bloqueo esté activo.
    • Múltiples transacciones pueden imponer un bloqueo compartido al mismo tiempo en una fila o página.
    • Es un candado común que ve en los objetos de su base de datos.

En el siguiente T-SQL, recuperamos el registro de cliente para una identificación de cliente específica. Además, usamos la vista de administración dinámica sys.dm_tran_locks para verificar los bloqueos existentes.

BEGIN TRAN
SELECT * FROM [SalesLT].[Customer] WITH (HOLDLOCK)
WHERE CustomerID=1
    
SELECT resource_type, request_mode, resource_description
FROM   sys.dm_tran_locks
WHERE  resource_type <> 'DATABASE'

ROLLBACK

Como se muestra a continuación, tiene un bloqueo compartido en el ID de recurso dado (8194443284a0):

  • Bloqueos exclusivos (X):
    • SQL Server usa bloqueo exclusivo (X) para operaciones DML (Eliminar, Insertar o Actualizar), lo que requiere modificar una fila o datos de página.
    • Evita que otros usuarios accedan al recurso hasta que se coloca un bloqueo.
    • SQL Server solo puede tener un bloqueo exclusivo en una página o fila para una transacción.

En este ejemplo, queremos actualizar los registros para el ID de cliente 1. Por lo tanto, SQL Server requiere un bloqueo exclusivo en el recurso. Ninguna otra transacción puede adquirir el bloqueo exclusivo en este recurso hasta que se complete la transacción.

BEGIN TRAN
UPDATE [SalesLT].[Customer] 
SET Suffix='Mr.'  
WHERE CustomerID=1
    
SELECT resource_type, request_mode, resource_description
FROM   sys.dm_tran_locks
WHERE  resource_type <> 'DATABASE'

ROLLBACK
  • Actualizar (U) candados:
    • El bloqueo de actualización es similar a un bloqueo exclusivo. Se puede colocar en un registro que tenga un bloqueo compartido.
    • El bloqueo de actualización coloca otro bloqueo compartido en una fila específica. Una vez que puede modificar los registros, SQL Server convierte el bloqueo de actualización en un bloqueo exclusivo.
    • SQL Server no puede colocar un bloqueo compartido en un recurso con un bloqueo de actualización.
    • También puede usar WITH UPDLOCK para forzar un bloqueo de actualización.

El siguiente ejemplo muestra un bloqueo de actualización en la identificación del recurso (8194443284a0):

BEGIN TRAN
SELECT * FROM [SalesLT].[Customer] WITH (UPDLOCK)
WHERE CustomerID=1
    
SELECT resource_type, request_mode, resource_description
FROM   sys.dm_tran_locks
WHERE  resource_type <> 'DATABASE'

ROLLBACK
  • Bloqueos de intención:
    • Su propósito es informar a una transacción sobre su intención de adquirir un candado. Ocurre cuando una transacción requiere un bloqueo compartido o exclusivo en los recursos inferiores en la jerarquía.
    • La transacción no permite que otras transacciones obtengan un bloqueo exclusivo en la tabla mediante un bloqueo de intención.
    • Los tipos de bloqueos de intención se encuentran a continuación.
      • Bloqueo de intención compartida (IS):indica la intención de SQL Server de leer recursos de jerarquía inferior mediante la adquisición de bloqueo compartido individualmente en esos recursos de jerarquía inferior.
      • Bloqueo de intención exclusiva (IX):indica la intención de SQL Server de modificar los recursos de jerarquía inferior mediante la obtención de un bloqueo exclusivo en esos recursos de jerarquía inferior.
      • Un bloqueo de actualización de intención (IU):se puede adquirir a nivel de página solo para recursos jerárquicos inferiores y, una vez que se completa la actualización, se convierte en un bloqueo IX.

Como se muestra a continuación, la transacción tiene un bloqueo exclusivo en una clave y tiene un bloqueo exclusivo de intención en el nivel de página.

Bloqueos de conversión

SQL Server convierte los tipos de bloqueo para admitir múltiples consultas en una transacción. Estos bloqueos se conocen como bloqueos de conversión.

  • SEIS:compartido con intención de bloqueo exclusivo:la transacción de SQL Server tiene un bloqueo compartido en varias páginas y tiene un exclusivo bloqueo en varias filas.
  • SIU:la transacción de SQL Server tiene un bloqueo compartido en varias páginas y tiene una Actualización bloqueo en varias filas.
  • UIX- Actualización con bloqueo exclusivo de intención:la transacción de SQL Server mantiene un bloqueo de actualización en varias páginas y tiene un exclusivo bloqueo en varias filas.

Bloqueos de esquema

SQL Server adquiere dos tipos de bloqueos de esquema.

  • Bloqueo de estabilidad del esquema (Sch-S):este bloqueo se utiliza cuando se compila una consulta que depende del esquema y se genera su plan de ejecución. El bloqueo Sch-S no bloquea ningún acceso a los datos del objeto.
  • Bloqueo de modificación de esquema (Sch-M):este bloqueo resulta de la ejecución de una consulta DDL (lenguaje de definición de datos). SQL Server solo puede tener un bloqueo de modificación de esquema en un objeto. No puede modificar un objeto con este bloqueo de esquema.

En el siguiente ejemplo, obtenemos bloqueos Sch-S y Sch-M al modificar una definición de objeto.

BEGIN TRAN
Alter TABLE DemoTable ADD new bit
SELECT resource_type, request_mode, resource_description
FROM   sys.dm_tran_locks
WHERE  resource_type <> 'DATABASE'
ROLLBACK

Compatibilidad de bloqueo

La compatibilidad de bloqueos es útil para verificar los bloqueos permitidos en caso de múltiples transacciones en el mismo recurso simultáneamente. Si una transacción coloca un bloqueo, el nuevo bloqueo colocado por otra transacción debería ser compatible con él. Por lo tanto, puede revisar la siguiente lista de compatibilidad de bloqueos y encontrar bloqueos admitidos durante múltiples transacciones.

Bloquear escaladas

SQL Server introdujo una característica de escalada de bloqueo para evitar demasiados bloqueos que pudieran causar presión en la memoria. SQL Server considera dinámicamente la cantidad de bloqueos retenidos en un escaneo particular y la cantidad de bloqueos retenidos por toda la transacción y la memoria. SQL Server convierte los bloqueos de bajo nivel en bloqueos de alto nivel en la escalada de bloqueo. Por ejemplo, convierte bloqueos de fila en bloqueos de nivel de página.

Utiliza el siguiente umbral para escaladas de bloqueo.

  • Umbral de memoria: El umbral de la memoria de bloqueo se establece en el 40 por ciento de la memoria de bloqueo.
  • Umbral de bloqueo: Si el número de bloqueos adquiridos en la tabla o el índice actual es superior a 5000, se pueden activar escaladas de bloqueo.

Los usuarios pueden controlar las escaladas de bloqueo mediante la declaración de modificación de la tabla. Puede deshabilitar completamente la escalada de bloqueo para esa tabla usando un valor de parámetro DISABLE.

ALTER TABLE Table_name SET (LOCK_ESCALATION = < TABLE | AUTO | DISABLE > –One of those options) GO

Puede consultar la documentación de Microsoft para comprender los escalamientos de bloqueo en detalle.

Nota:no debe deshabilitar la escalada de bloqueo hasta que se haya probado exhaustivamente en un entorno más bajo, y se recomienda su uso solo por administradores de bases de datos experimentados.

Conclusión

Este artículo brinda una descripción detallada de los bloqueos de SQL Server y el DMV para monitorear el bloqueo y su proceso de escalamiento. El bloqueo es un comportamiento bastante normal en SQL Server, y debe estar familiarizado con él para comprender cómo funcionan múltiples transacciones, simulando y proporcionando datos coherentes.