none
Como não efetuar lock em uma atualização RRS feed

  • Pergunta

  • Alguém sabe como posso efetuar dois updates simultaneamente em uma mesma tabela/registro. Existe algum hint para isso, como temos o nolock para select?

    att.

    terça-feira, 19 de novembro de 2013 10:26

Respostas

  • Bom dia,

    Isso não é possível. O update gera um bloqueio exclusivo a fim de garantir a consistencia dos dados. Se o banco permitisse isso ele estaria indo contra o principio ACID, em especial ao I que significa isolamento, onde que ele diz que transações paralelas não podem interfirir umas nas outras. Sendo assim, quando você inicia um update, nenhuma outra transação pode interfirir nas linhas que estão sofrendo o update (transação) até que exista um commit ou rollback.

    At.
    Rafael

    terça-feira, 19 de novembro de 2013 11:51

Todas as Respostas

  • Amigo, você pode definir níveis de isolamento de transações (transaction isolation levels). Antes de disparar a querie, você pode definir o nível READ UNCOMITTED, o qual irá permitir acesso aos dados durante o update, porém apenas aos dados não comitados. Você pode verificar outros níveis de isolamento que possam atender suas necessidades no link abaixo:

    SET TRANSACTION ISOLATION LEVEL

    Att,


    Angelo Máximo
    MTA | MCITP | MCT | CCSQLA
    sqlmax@outlook.com
    http://angmaximo.wordpress.com/

    Se a resposta foi útil, não esqueça de classificá-la.


    • Editado Angelo Maximo terça-feira, 19 de novembro de 2013 11:47
    terça-feira, 19 de novembro de 2013 11:47
  • Bom dia,

    Isso não é possível. O update gera um bloqueio exclusivo a fim de garantir a consistencia dos dados. Se o banco permitisse isso ele estaria indo contra o principio ACID, em especial ao I que significa isolamento, onde que ele diz que transações paralelas não podem interfirir umas nas outras. Sendo assim, quando você inicia um update, nenhuma outra transação pode interfirir nas linhas que estão sofrendo o update (transação) até que exista um commit ou rollback.

    At.
    Rafael

    terça-feira, 19 de novembro de 2013 11:51
  • Olá rafael, já viu algum forma de lock por coluna pois é uma tabela de consolidação de dados e tenho várias colunas.

    Exclusivamente cada sessão irá alterar as suas respectivas colunas.

    att.

    terça-feira, 19 de novembro de 2013 11:57
  • Olá,

    Os tipos de locks do sql server são por exemplo, de Linha, pagina, hobt (heap ou arvore B), tabela, extent, etc.... Não é possível lock por columas. Não até o sql server 2008. não conheço o 2012.

    nivel de locks:
    http://technet.microsoft.com/en-us/library/ms189849(v=sql.105).aspx

    At.
    Rafael

    terça-feira, 19 de novembro de 2013 12:24
  • Rafael,

    Isso se mantem da mesma forma no SQL Server 2012, não existe Lock de Colunas!!!


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    sexta-feira, 22 de novembro de 2013 22:42
    Moderador