Monitora as sessões bloqueadas de uma instância SQL.
O monitor de bloqueio de sessões detecta se existe uma situação de bloqueio.
O bloqueio ocorre quando uma sessão mantém um bloqueio em um recurso específico e uma segunda sessão tenta obter um tipo de bloqueio conflitante no mesmo recurso. O bloqueio é uma característica inevitável de qualquer RDBMS com simultaneidade baseada em bloqueio. No entanto, um alto nível de bloqueio pode ocasionar problemas de desempenho.
Quando o bloqueio aumenta a ponto de impactar o desempenho do sistema, isso geralmente acontece por um dos seguintes motivos:
Uma sessão mantém o bloqueio em um conjunto de recursos e nunca os libera. Isso é geralmente ocasionado por:
Consultas canceladas que não são revertidas
Transações órfãs
Uma sessão (identificada por uma session_id ou “SPID”) mantém o bloqueio em um conjunto de recursos por um período estendido até liberá-los. Isso é geralmente ocasionado por:
Transações de longa execução
Falta de índices apropriados
Uso inapropriado de dicas de bloqueio
Outros problemas relacionados a um design de aplicativo insatisfatório
Elimine a sessão no início da cadeia de bloqueio
Reduza a duração da transação
Crie índices apropriados
Use dicas de bloqueio. Consulte os Manuais Online do SQL Server
Use níveis de isolamento com base no controle de versão de linha
Defina configurações do SQL Server (configurações de memória, tempos limite de bloqueio etc.)
Altere os limites no monitor para esse banco de dados específico ou para todos os bancos de dados
Como alternativa, se as sessões bloqueadas não forem um problema para o banco de dados:
Desabilite o monitor para esse banco de dados específico ou para todos os bancos de dados
Consulte também: “ INF: Compreender e resolver problemas de bloqueio do SQL Server”
Target | Microsoft.SQLServer.2008.DBEngine | ||
Parent Monitor | System.Health.PerformanceState | ||
Category | PerformanceHealth | ||
Enabled | False | ||
Alert Generate | True | ||
Alert Severity | Error | ||
Alert Priority | High | ||
Alert Auto Resolve | True | ||
Monitor Type | Microsoft.SQLServer.2008.DBEngine.BlockedSPIDs | ||
Remotable | True | ||
Accessibility | Public | ||
Alert Message |
| ||
RunAs | Default |
<UnitMonitor ID="Microsoft.SQLServer.2008.DBEngine.BlockedSPIDsMonitor" Accessibility="Public" Enabled="false" Target="SQL2008Core!Microsoft.SQLServer.2008.DBEngine" ParentMonitorID="SystemHealth!System.Health.PerformanceState" Remotable="true" Priority="Normal" TypeID="Microsoft.SQLServer.2008.DBEngine.BlockedSPIDs" ConfirmDelivery="false">
<Category>PerformanceHealth</Category>
<AlertSettings AlertMessage="Microsoft.SQLServer.2008.DBEngine.BlockedSPIDsMonitor.AlertMessage">
<AlertOnState>Error</AlertOnState>
<AutoResolve>true</AutoResolve>
<AlertPriority>High</AlertPriority>
<AlertSeverity>Error</AlertSeverity>
<AlertParameters>
<AlertParameter1>$Data/Context/Property[@Name='BlockedSPIDList']$</AlertParameter1>
<AlertParameter2>$Target/Property[Type="SQL!Microsoft.SQLServer.ServerRole"]/InstanceName$</AlertParameter2>
<AlertParameter3>$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/NetworkName$</AlertParameter3>
</AlertParameters>
</AlertSettings>
<OperationalStates>
<OperationalState ID="Blocked" MonitorTypeStateID="Blocked" HealthState="Error"/>
<OperationalState ID="NotBlocked" MonitorTypeStateID="NotBlocked" HealthState="Success"/>
</OperationalStates>
<Configuration>
<ConnectionString>$Target/Property[Type="SQL!Microsoft.SQLServer.DBEngine"]/ConnectionString$</ConnectionString>
<IntervalSeconds>300</IntervalSeconds>
<SyncTime/>
<WaitMinutes>1</WaitMinutes>
<NumberBlockedSPIDs>1</NumberBlockedSPIDs>
<TimeoutSeconds>300</TimeoutSeconds>
<InstanceName>$Target/Property[Type="SQL!Microsoft.SQLServer.ServerRole"]/InstanceName$</InstanceName>
<ComputerName>$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/NetworkName$</ComputerName>
</Configuration>
</UnitMonitor>