none
Executar update em tabela onde alguns registros estão bloqueados RRS feed

  • 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

    quarta-feira, 29 de fevereiro de 2012 12:22

Respostas

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

    quarta-feira, 29 de fevereiro de 2012 13:13
  • Marcelo, a versão de meu sql é a 2005 =[ ...num funfou! 

    Obrigado,

    Denison Soares

    quarta-feira, 29 de fevereiro de 2012 13:31
  • 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/gmasql


    Classifique as respostas. O seu feedback é imprescindível

    quarta-feira, 29 de fevereiro de 2012 17:25
  • Gustavo, como faço para descobrir o que está causando lock nos registros dessa tabela?? Obrigado !!

    []s

    Denison Soares

    quarta-feira, 29 de fevereiro de 2012 18:17
  • 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/gmasql


    Classifique as respostas. O seu feedback é imprescindível

    • Marcado como Resposta Denison Soares segunda-feira, 28 de maio de 2012 15:00
    quarta-feira, 29 de fevereiro de 2012 21:06
  • Gusvato, a consulta do Marcelo não rodou na versão 2005. Vou dar uma lida em seu artigo.

    Muito Obrigado !!

    []'

    Denison Soares

    quinta-feira, 1 de março de 2012 11:24