sqlserver

Ejercicio

Este es un ejercicio curioso - quizás poco práctico - para conocer los fundamentos de bloqueos en SQL Server.

¿Por qué para cada conexión establecida en SQL Server aparece un bloqueo compartido (S) sobre el tipo de recurso (resource_type = DATABASE)?

select 
request_session_id, 
resource_type, resource_database_id, 
request_mode, request_type, request_status
from sys.dm_tran_locks
where request_session_id = 64; -- CAMBIA POR TU SESSION_ID

image

Solución

Abre una conexión nueva con SSMS (Ctrl + N); asegurate que la otra conexión permanece abierta contra la misma base de datos!

Ahora ejecuta el comando DROP DATABASE .

Verás como tras varios segundos, la operación mostrará un mensaje de error como este:

image

Si durante el intento de borrado, has sido rápido para ejecutar esta consulta:

select 
request_session_id, 
resource_type, resource_database_id, 
request_mode, request_type, request_status
from sys.dm_tran_locks

podrás ver que la conexión que intenta hacer el borrado, tendrá:

y ejecutando esta consulta:

SELECT 
	blocked.session_id blocked_session_id, 
	blocker.session_id blocker_session_id, 
	sql_blocker.text blocker_query_text,
	sql_blocked.text blocked_query_text,	req.command,
	req.status, 
	req.start_time,
	req.wait_resource,
	req.wait_time,
	req.wait_resource
FROM    sys.dm_exec_requests req
JOIN    sys.dm_exec_sessions blocked
ON      req.session_id = blocked.session_id
JOIN    sys.dm_exec_sessions blocker
ON      req.blocking_session_id = blocker.session_id
OUTER APPLY sys.dm_exec_sql_text(req.sql_handle) sql_blocked
JOIN    sys.dm_exec_connections c
ON      blocker.session_id = c.session_id
OUTER APPLY sys.dm_exec_sql_text(c.most_recent_sql_handle) sql_blocker

Podrás ver que la sesión bloqueada, tendrá estas columnas:

¿Qué quiere decir esto? la conexión que quiere hacer el borrado de la BBDD, no puede hacerlo, porque está solicitando un bloqueo X (exclusivo) sobre el recurso DATABASE, y que el motor no se lo puede conceder porque hay otra conexión con un bloqueto tipo S (compartido).

Como sabes, cuando quieres borrar una BBDD en SQL Server, es necesario que nadie tenga una conexión abierta contra la BBDD. El borrado necesita un bloqueo exclusivo contra la BBDD, cosa que no es compatible como ves arriba.