Inquiridor
Begin Transaction

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?
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
William John Adam Trindade
Analyste-programmeur
----------------------------------------------------------
-
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
- Sugerido como Resposta Kanaãm Luz Romero Rodrigues quarta-feira, 25 de setembro de 2013 22:03