Cuando se está ejecutando simultaneamente más de un proceso, es habitual que nos encontremos que dos de ellos intentan modificar el mismo registro. SQL Server produce un bloqueo como mecanismo de protección de la integridad de nuestros datos. El problema es cuando estos bloqueos provocan que las consultas comiencen a experimentar problemas.
En esta entrada vamos a intentar explicar como identificar un bloqueo, y cómo crearlos de una manera práctica y sencilla.
¿Cómo generar un bloqueo?
Para comprenderlos bloqueos realizamos una prueba en nuestro laboratorio, que nos servirá para generarlos y utilizar dichos scripts para futuros laboratorios, o incluso en nuestros proyectos.
1. Creamos una tabla y la rellenamos con datos de muestra.
USE [SICUEL] GO CREATE TABLE [sicuel_tableblk](ID INT, NOMBRE VARCHAR(50)) -- Rellenamos nuestra tabla con datos de ejemplo declare @i int set @i=1 while @i < 1000 begin insert into [sicuel_tableblk] (ID, NOMBRE)values(@i,'SQL Server Base' +CAST(@i as CHAR(100))) set @i=@i+1 end select * from sicuel_tableblk
2. Abrimos una nueva ventana y lanzamos un update sobre la tabla que hemos creado con begin tran y un waitfor delay con una espera de dos minutos.
begin tran update [sicuel_tableblk] set NOMBRE = 'SQL Server Base1' where ID=1 waitfor delay '00:02:00' commit
3. Mientras nuestra consulta anterior se ejecuta en esos dos minutos gracias al waitfor delay lanzamos un nuevo update sobre la misma tabla para producir el bloqueo:
update [sicuel_tableblk] set NOMBRE ='SQL Server Base2' where ID=1
¿Cómo detectar un bloqueo?
Una vez generado el bloqueo procedemos a detectarlo y ver detalles del mismo de diferentes modos.
1. sp_who2
Como ya os comentamos en nuestra primera entrada de este blog SP_WHO y cómo filtrarlo | SICUEL.es, a través de sp_who2 podemos obtener información sobre usuarios, sesiones y procesos, donde a través BLK nos indica si algun proceso presenta un bloqueo. En dicha entrada también te explicamos como filtrarlo.
2. Activity Monitor
SQL Server Management Studio (SSMS) nos presenta la herramienta ‘Activity Monitor’, a la cual se accede a través del botón derecho sobre la instancia, y que nos muestra información sobre los procesos.
3. sys.sysprocesses
También podemos detectar los bloqueos que se están produciendo lanzando consultas sobre la vista de sistema sys.sysprocesses Procesos de sys.sys(Transact-SQL) – SQL Server | Microsoft Docs la cual contiene información sobre los procesos que se están ejectuando en la instancia. Para detectar los procesos bloqueados podemos filtrarlo a través de un where.
Esperemos que si has llegado hasta aquí te haya servido esta entrada. Hay mucho que hablar de todo este tema pero queríamos solo abordar su parte más sencilla. Seguro que en futuro próximo profundizamos sobre los tipos, análisis, gestión, etc.