Usuário com melhor resposta
Executar update em tabela onde alguns registros estão bloqueados

Pergunta
-
Pessoal, bom dia!
Executei um update simples: update clientes set publico = 1 where publico = 2
...após vários minutos aguardando, a mensagem "Executando Consulta..." continua aparecendo.
Resolvi executar como select:
select * from clientes where publico = 2
...e novamente após várias minutos aguardando, a mensagem "Executando Consulta" continua aparecendo...
Executei o select acrescentado do comando (nolock). A consulta foi executada imediatamente (0 segundos):
Exemplo: select * from (nolock) clientes where publico = 2
Agora vem a pergunta...rs :V
Como faço para identificar nessa tabela os registros que estão com lock ? Ou como faço para desconsiderá-los no update?
Tentei executar da forma a seguir mas foi retornado mensagem de erro de sintaxa: update clientes (nolock) set publico = 1 where publico = 2
Obrigado,
Denison Soares
Respostas
-
Oi Denilson,
A consulta do Marcelo é uma das formas, mas se quiser uma outra alternativa, sugiro o link abaixo:
Monitorando bloqueios com o uso de Recursive Common Table Expressions
http://gustavomaiaaguiar.wordpress.com/2009/12/18/monitorando-bloqueios-com-o-uso-de-recursive-common-table-expressions/[ ]s,
Gustavo Maia Aguiar
Blog: http://gustavomaiaaguiar.wordpress.com
Vídeos:http://www.youtube.com/user/gmasqlClassifique as respostas. O seu feedback é imprescindível
- Marcado como Resposta Denison Soares segunda-feira, 28 de maio de 2012 15:00
Todas as Respostas
-
Denison
o Nolock é inoquo no UPDATE... pois ele precisa fazer um lock
no seu caso, você precisa analisar quem esta te bloqueando e quem vc esta bloqueando, acredito que o script abaixo vai te ajudar neta investigação
select wt.Session_id as Sessao_Bloqueada ,wt.blocking_session_id as Sessao_Bloqueador ,convert(money,wt.wait_duration_ms)/1000 as [Tempo de Espera do Bloqueado SS] ,SBloqueada.Host_name as Host_name_Bloqueado ,SBloqueada.Program_Name as Program_Name_Bloqueado ,SBloqueada.Login_Name as Login_Name_Bloqueado ,SBloqueada.Deadlock_priority as Deadlock_priority_Bloqueado ,RBloqueada.Status as Status_Bloqueado ,RBloqueada.Command as Command_Bloqueado ,RBloqueada.Wait_Type as Wait_Tipe_Bloqueado ,RBloqueada.Last_wait_type as Last_wait_Type_Bloqueado ,RBloqueada.Wait_Resource as Wait_Resource_Bloqueado ,RBloqueada.Total_Elapsed_Time as Total_Elapsed_Time_Bloqueado ,SBloqueador.Host_name as Host_name_Bloqueador ,SBloqueador.Program_Name as Program_Name_Bloqueador ,SBloqueador.Login_Name as Login_Name_Bloqueador ,SBloqueador.Deadlock_priority as Deadlock_priority_Bloqueador /* ,RBloqueador.Status as Status_Bloqueador ,RBloqueador.Command as Command_Bloqueador ,RBloqueador.Wait_Type as Wait_Tipe_Bloqueador ,RBloqueador.Last_wait_type as Last_wait_Type_Bloqueador ,RBloqueador.Wait_Resource as Wait_Resource_Bloqueador ,RBloqueador.Total_Elapsed_Time as Total_Elapsed_Time_Bloqueador */ ,wt.wait_type ,dtl.resource_type ,db_name(dtl.resource_database_id) as DataBaseName ,dtl.Resource_description ,dtl.request_mode ,SPBloqueador.status as Status_Bloqueador ,SPBloqueador.Last_Batch as Last_Batch_Bloqueador ,dtl.request_type ,est.text as Comando_Bloqueado ,estbloqueador.text as Comando_Bloqueador from sys.dm_os_waiting_tasks as wt inner join sys.dm_tran_locks as dtl on wt.resource_address = dtl.lock_owner_address inner join sys.dm_exec_sessions as SBloqueada on dtl.request_session_id = SBloqueada.session_id inner join sys.dm_exec_sessions as SBloqueador on wt.blocking_session_id = SBloqueador.session_id inner join sys.dm_exec_Requests as RBloqueada on SBloqueada.session_id = RBloqueada.session_id --inner join sys.dm_exec_Requests as RBloqueador --on SBloqueador.session_id = RBloqueador.session_id cross apply sys.dm_exec_sql_text(RBloqueada.sql_handle) as est inner join sys.sysprocesses as SPBloqueador on wt.blocking_session_id = SPBloqueador.spid cross apply sys.dm_exec_sql_text(SPBloqueador.sql_handle) as estbloqueador where wt.session_id > 50 and dtl.request_status = 'wait' order by [Tempo de Espera do Bloqueado SS] desc
Att.
Marcelo Fernandes
MCP, MCDBA, MCSA, MCTS.
Se útil, classifique!!!
Me siga no twitter: @marcelodba -
-
Boa Tarde,
É possível fazer o UPDATE para atualizar somente quem não está bloqueado, mas eu pergunto será que isso é consistente ? Eu entendo que se você deseja atualizar todos os registros cujo o público é 2, você quer realmente ter certeza de que atualizará todos os registros que tem essa condição. Se pular os bloqueados, vai ficar esquisito, pois, o UPDATE não terá sido 100% efetivo já que os registros bloqueados não terão seus valores atualizados.
Problemas de bloqueio normalmente tem origem e solução em outros itens. A ausência de índices e uma estratégia inadequada de acesso costumam estar entre os maiores problemas e o NOLOCK é um remédio que além de não resolver, impede que você ataque a verdadeira causa.
[ ]s,
Gustavo Maia Aguiar
Blog: http://gustavomaiaaguiar.wordpress.com
Vídeos:http://www.youtube.com/user/gmasqlClassifique as respostas. O seu feedback é imprescindível
-
-
Oi Denilson,
A consulta do Marcelo é uma das formas, mas se quiser uma outra alternativa, sugiro o link abaixo:
Monitorando bloqueios com o uso de Recursive Common Table Expressions
http://gustavomaiaaguiar.wordpress.com/2009/12/18/monitorando-bloqueios-com-o-uso-de-recursive-common-table-expressions/[ ]s,
Gustavo Maia Aguiar
Blog: http://gustavomaiaaguiar.wordpress.com
Vídeos:http://www.youtube.com/user/gmasqlClassifique as respostas. O seu feedback é imprescindível
- Marcado como Resposta Denison Soares segunda-feira, 28 de maio de 2012 15:00
-