none
Begin Transaction RRS feed

  • Pergunta

  • Pessoal estou com um problema que detectamos aqui na empresa hoje, temos uma procedure em nosso banco que tem à função de finalizar vendas  e nela utilizamos o Begin transaction e notamos que:

    Dentro da Procedure e dentro do Begin Transaction eu tenho um comando update e no meu formulário de vendas eu tenho um componente em delphi que faz um select simples nessa mesma tabela e o que percebemos que a tela fica congelada até que se execute o commite ou rollback no banco de dados, verificamos que se executamos algum select na mesma tabela via sql server a mesma é executada, agora se o select vem nessa aplicação o resultado é diferente o mesmo fica em espera até o rolback ou comit, verifiquei também que quando eu verifico sessões bloqueadas a sessão que inicou o begin transaction esta registrada no banco conforme abaixo

    SELECT  
        db_name(resource_database_id) As Banco, T.name As Tabela,  
        request_mode As Modelo, request_session_id As Sessao, 
        (SELECT Sys.sysprocesses.hostname FROM Sys.sysprocesses WHERE Sys.sysprocesses.spid = B.request_session_id) AS Computador, 
        (SELECT Sys.sysprocesses.cmd FROM Sys.sysprocesses WHERE Sys.sysprocesses.spid = B.request_session_id) AS TpComando 
         
    FROM  
        sys.dm_tran_locks As B 
        INNER JOIN sys.tables As T ON B.resource_associated_entity_id = T.object_id 
               
    /*WHERE resource_type = 'OBJECT'  
      AND resource_associated_entity_id > 10    */

    O resultado do Select:

    BANCO   TABELA  MODELO   SESSÃO     COMPUTADOR    COMANDO

    TESTE     VENDAS IX             55             EST-WIC16         SELECT

    Outro detalhe importante que quando o begin transaction possui apenas select ou insert isso não ocorre a partir do momento que ocorre o update o problema ocorre alguem poderia me explicar o que acontece?

    segunda-feira, 23 de setembro de 2013 14:33

Todas as Respostas

  • Um update (internamente falando) é um delete, seguido de um insert e neste caso haverá sempre um lock na sua tabela.

    Para entender um pocuo mais, veja o artigo:

    http://www.codeproject.com/Articles/342248/Locks-and-Duration-of-Transactions-in-MS-SQL-Serve

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    segunda-feira, 23 de setembro de 2013 15:41
  • Eder, quando você executa o comando begin transaction, significa que ele não vai gravar os dados que você está trabalhando na tabela física até que você envie a ordem, ou seja, quando você deu o begin transaction e em seguida deu o update, o banco automaticamente "locka" esse registro que você está atualizando para que ninguém consiga trabalhar com ele até que você confirme se a alteração é válida ou não utilizando o commit ou rollback.

    Os dados que você alterou dentro da estrutura de transaction ficam gravados em memória, e somente quando é executado o commit que ele grava na tabela e finaliza a transação.

    Para solucionar o seu problema, poderia utilizar a cláusula "WITH (NO LOCK)" no select de sua aplicação, dessa forma ele irá fazer uma "busca suja" e não terá que aguardar o commit ou rollback.

    Acho que é basicamente isso, qualquer dúvida posta ai.

    Se foi útil marca como resposta.

    Abraço!


    "A vida é um paraíso, mas os homens não o sabem e não se preocupam em sabê-lo." Fiodor Dostoievski

    segunda-feira, 23 de setembro de 2013 15:44