Saltar al contenido

Tabla bloqueada en sql server

Si un bloqueo de tabla dura demasiado tiempo, puede afectar el rendimiento de la aplicación y, en casos extremos, puede causar una interrupción en el servicio. Por lo tanto, es importante monitorear y solucionar los bloqueos de tabla lo antes posible.

Por lo tanto en este articulo te muestro como identificarlo, y que hacer para monitorear cuando ocurre esto.

Índice

    Que es un bloqueo de tablas en sql server?

    Un bloqueo de tablas en SQL Server ocurre cuando dos o más transacciones intentan acceder a la misma tabla al mismo tiempo y alguna de ellas obtiene un bloqueo exclusivo sobre la tabla, lo que significa que la otra transacción tiene que esperar hasta que se libere el bloqueo para poder acceder a la tabla.

    Cuales son la razones por la que ocurre un bloqueo ?

    Esto sucede porque SQL Server utiliza un mecanismo de bloqueo para asegurar la integridad de los datos en la base de datos y prevenir la concurrencia, es decir, la posibilidad de que varios usuarios intenten modificar la misma información al mismo tiempo.

    Hay varias razones por las que una tabla en SQL Server puede estar bloqueada. Algunas de las razones más comunes incluyen:

    1. Transacciones largas: Si una transacción está tomando mucho tiempo en ejecutarse y adquirió un bloqueo en una tabla, puede ser difícil para otras transacciones acceder a la misma tabla hasta que la transacción original se complete.
    2. Escrituras en la misma tabla: Si dos transacciones están tratando de escribir en la misma tabla al mismo tiempo, puede haber conflicto y una de ellas puede quedar bloqueada hasta que se complete la otra.
    3. Índices dañados: Si un índice está dañado o desorganizado, puede causar bloqueos en las tablas asociadas.
    4. Deadlocks: Si dos o más transacciones están esperando acceder a los mismos recursos, puede ocurrir un deadlock y ambas transacciones pueden quedar bloqueadas.

    Es importante monitorear y resolver los bloqueos de manera oportuna para evitar problemas de rendimiento y asegurar que las transacciones se completen de manera eficiente.

    En sql server, como saber si una tabla esta bloqueada ?

    Para saber si una tabla en SQL Server está bloqueada, puedes ejecutar una consulta en la tabla de sistema «sys.dm_tran_locks». La siguiente consulta te muestra todos los bloqueos en la base de datos actual:

    SELECT resource_type, resource_database_id, resource_associated_entity_id, request_mode, request_status
    FROM sys.dm_tran_locks
    WHERE resource_type = 'OBJECT' AND resource_associated_entity_id = OBJECT_ID('[nombre de la tabla]')
    

    Reemplaza «[nombre de la tabla]» con el nombre de la tabla que deseas revisar. Si la consulta devuelve algún resultado, eso significa que la tabla está bloqueada y que hay una transacción activa que está utilizando la tabla.

    Procedimiento en sql server para monitorear las tablas bloqueadas

    Puedes crear un procedimiento en SQL Server para monitorear los bloqueos de las tablas de la base de datos.

    Aquí te muestro un ejemplo de un script que puedes utilizar:

    Create procedure InformacionBloqueotabla 
    as
    DECLARE @blocked_session INT
    DECLARE @blocked_command VARCHAR(50)
    DECLARE @blocking_session INT
    DECLARE @blocking_command VARCHAR(50)
    DECLARE @sql NVARCHAR(MAX)
    
    SELECT @blocked_session = blocked_session_id,
           @blocked_command = blocked_command,
           @blocking_session = blocking_session_id,
           @blocking_command = blocking_command
    FROM sys.dm_exec_requests
    WHERE blocking_session_id > 0
    
    IF @blocked_session IS NOT NULL
    BEGIN
        SET @sql = 'SELECT * FROM sys.dm_exec_sessions WHERE session_id = ' + CAST(@blocked_session AS VARCHAR(10))
        EXEC sp_executesql @sql
    
        SET @sql = 'SELECT * FROM sys.dm_exec_sessions WHERE session_id = ' + CAST(@blocking_session AS VARCHAR(10))
        EXEC sp_executesql @sql
    END
    ELSE
    BEGIN
        PRINT 'No hay bloqueos de sesión actualmente.'
    END
    

    Este script utiliza la tabla de sistema «sys.dm_exec_requests» para verificar si hay alguna sesión bloqueada y, de ser así, muestra información detallada sobre la sesión bloqueada y la sesión que está bloqueando. Puedes agendar este script para ejecutarse periódicamente y notificarte si se detecta algún bloqueo en las tablas de la base de datos.

    CRUD base de datos

    Configurar notificación monitorear bloqueo

    Como hemos visto en powershell podemos hacer distintas tareas que pueden simplificarnos las vida como dentro de mism funciones como dba, ya hemos vistos como importar informacion a sql server o exportar desde el mismo.

    En esta ocasion te muestro como puedes agregar una notificación en PowerShell con el script que acabas de proporcionar.

    Aquí te muestro un ejemplo de código que puedes utilizar:

    $connectionString = "Data Source=<server_name>;Initial Catalog=<database_name>;Integrated Security=True"
    
    $query = @" EXEC InformacionBloqueotabla"@
    
    $blockedSession = Invoke-Sqlcmd -Query $query -ConnectionString $connectionString | Select-Object -ExpandProperty Column1
    
    if ($blockedSession -eq "No hay bloqueos de sesión actualmente.") {
        Write-Host "No hay bloqueos en este momento."
    }
    else {
        Send-MailMessage -To "<email_address>" -Subject "Bloqueos en la base de datos" -Body $blockedSession -SmtpServer "<smtp_server>"
    }
    

    Reemplaza los valores encerrados en <> con los valores apropiados para tu entorno. Esta notificación utiliza el cmdlet «Invoke-Sqlcmd» para ejecutar el script de SQL en la base de datos y el cmdlet «Send-MailMessage» para enviar un correo electrónico si se detecta algún bloqueo.

    Nota: Este código supone que tienes configurado un servidor SMTP y que tienes permisos para enviar correos electrónicos desde el servidor.

    En conclusion

    Un bloqueo de tablas puede ser de lo peor que puede pasarte sino lo detectas a tiempo pero con una notificacion y los script adecuados puedes evitarte muchos problemas dentro del servidor.

    Comentanos que tal tu experiencia con este error!

    hasta la proxima gracias :D!!