2009-05-07 6 views
7

Tengo una declaración SQL de mi aplicación. Me gustaría saber qué bloqueos adquiere esa declaración; ¿cómo puedo hacer eso con el servidor SQL? La declaración ha estado involucrada en un punto muerto, que estoy tratando de analizar; No puedo reproducir el punto muerto. Estoy ejecutando en MS SQL Server 2005.¿Qué cerraduras se adquieren en una consulta en SQL Server?

Respuesta

3

Sugiero que encienda las Banderas de rastreo de detección de interbloqueo en primer lugar, en lugar de ejecutar un Rastreador de perfiles indefinidamente.

De esta forma, los detalles del evento se registrarán en el Registro de errores del servidor SQL.

Revise la siguiente referencia de Libros en pantalla para obtener detalles de las diversas marcas de seguimiento. Es necesario utilizar 1204 y/o 1222

http://msdn.microsoft.com/en-us/library/ms188396(SQL.90).aspx

Asegúrese de activar las marcas de traza con ámbito de servidor y no sólo la sesión actual. Por ejemplo use:

DBCC TRACEON(1222,-1) 
+0

Interesante, ¿cómo puedo configurar las banderas? en un analizador de consultas? cualquier sobrecarga involucrado aquí? – Tomas

+0

Ejecuté "DBCC TRACEON (1222, -1)" y "DBCC TRACEON (1204, -1)" y comencé una traza gráfica de interbloqueo (en el servidor sql 2005). Cuando forcé un punto muerto, el rastro lo capturó. Sin embargo, no hay ningún registro del punto muerto en el registro de errores de SQL Server. Estoy buscando en SQL Server Management Studio en el "Agente SQL Server" + "Registros de error" + "Actual -" + clic derecho + "Ver registro del agente" ¿qué podría estar haciendo mal? –

+0

Está buscando los registros incorrectos, esos son los registros del agente. Gestión> Sql Server Logs – Sam

2

ejecute un seguimiento en el generador de perfiles (elija la plantilla en blanco), seleccione el evento gráfico de interbloqueo y en la nueva pestaña que aparece (Configuración de extracción de eventos), guarde cada uno (verifique salvar eventos XML de interbloqueo por separado) en su propio archivo. Abra este archivo en un visor xml y será fácil saber qué está sucediendo. Cada proceso está contenido, con una pila de llamadas a procedimientos, etc. y todos los bloqueos están allí también.

Deje que este trazado se ejecute hasta que el interbloqueo vuelva a ocurrir, la información solo se graba cuando ocurre un punto muerto, por lo que no hay demasiada sobrecarga. Si nunca vuelve a suceder, está bien resuelto, si no has capturado toda la información.

+0

Pero para hacer eso tendría que volver a crear el escenario mientras se ejecuta dejar rastro? No puedo reproducir el escenario. – Tomas

+0

¿Cuál es la sobrecarga de ejecutar esa traza? – Tomas

+0

ejecuta esta traza en producción, o donde sea que esté sucediendo. Si nunca vuelve a ver el punto muerto, no haga nada. si lo ves, esto registrará lo que sucedió y luego podrás descubrir qué está pasando. –

4

Puede ejecutar la declaración en una transacción, pero no comprometer la transacción. Dado que los bloqueos se mantendrán hasta que se haya comprometido la transacción, esto le da tiempo para inspeccionar los bloqueos. (No es por tiempo indefinido, pero al igual que 5 minutos de forma predeterminada.)

igual:

BEGIN TRANSACTION 
select * from table 

A continuación, abra Management Studio y comprobar los bloqueos. Están en Gestión -> Monitor de actividad -> Bloqueos por objeto o Bloqueos por proceso. Después de que haya terminado, ejecute:

COMMIT TRANSACTION 

para liberar los bloqueos.

0

Puede ejecutar un rastreo de perfilador en su cuadro de desarrollo para las consultas y ver exactamente qué bloqueos se toman. Esta suele ser una gran cantidad de datos, pero gran parte de ella serán patrones sobre los que puede echar un vistazo. P.ej. para el aislamiento comprometido de lectura, verá una sucesión de bloqueos que se adquirirá y liberará cuando realice una exploración de tabla o índice (cada fila debe estar bloqueada antes de ser leída, y se libera inmediatamente después de que se lee).

¿Con qué aislamiento trabaja? ¿Qué tipo de consultas están bloqueando? ¿Está utilizando transacciones explícitas que abarcan múltiples actualizaciones, o son sentencias únicas de bloqueo de declaraciones?

El caso más típico de un punto muerto es una transacción con la secuencia (tabla de actualización x, tabla de actualización y) y una segunda transacción con la secuencia (tabla de actualización y, tabla de actualización x). La solución común es asegurarse de usar la misma secuencia de actualización en las consultas.

Háganos saber qué tipo de consultas son, existen diferentes problemas comunes para diferentes tipos de transacciones.

3

Aquí hay una consulta que le mostrará todos los bloqueos activos, quién los tiene y en qué objeto se encuentran. Saqué esto de un artículo de Technet o algo así hace años y años. Funciona en SQL 2000 y 2005 (cambie sysobjects en sys.objects para 2005.) Descomente la cláusula WHERE si desea restringirlo a este solo databse, y solo a los bloqueos "EXCLUSIVE".

select 'Locks' as Locks, 
    spid, nt_username, name, hostname, loginame, waittime, open_tran, 
    convert(varchar ,getdate() - last_batch, 114) as TimeSinceLastCommand, 
    case req_mode 
    when 0 then 'Not granted' 
    when 1 then 'Schema stability' 
    when 2 then 'Schema modification' 
    when 3 then 'Intent shared' 
    when 4 then 'Shared intent update' 
    when 5 then 'Intent shared shared' 
    when 6 then 'Intent exclusive' 
    when 7 then 'Shared Intent Exclusive' 
    when 8 then 'Shared' 
    when 9 then 'Update' 
    when 10 then 'Intent insert NULL' 
    when 11 then 'Intent shared exclusive' 
    when 12 then 'Intent update' 
    when 13 then 'Intent shared-update' 
    when 14 then 'Exclusive' 
    when 15 then 'Bulk operation' 
    else str(req_mode) end as LockMode 
from master..syslockinfo 
    left join sysobjects so on so.id = rsc_objid 
    left join master..sysprocesses sp on sp.spid = req_spid 
--where rsc_dbid = (select db_id()) and ltrim(req_mode) in (6,7,11,14) 
+0

Pequeño comentario: los números son un poco diferentes para SQL 2012: http://technet.microsoft.com/en-us/library/ms189497.aspx – n0rd

Cuestiones relacionadas