Sql Server 2005 - gerenciar a simultaneidade em tabelas

votos
1

Eu tenho em um aplicativo ASP.NET este processo:

  • Iniciar uma conexão
  • Iniciar uma transação
  • Inserir em uma tabela LoadData um monte de valores com a classe SqlBulkCopy com uma coluna que contém um LoadId específico.
  • Chamar um procedimento armazenado que:
    • ler a tabela LoadData para o LoadId específico.
    • Para cada linha faz um monte de cálculos que implica leitura dezenas de tabelas e escrever os resultados em uma tabela temporária (#temp) (processo que duram vários minutos).
    • Exclui as linhas LoadDate para o LoadId específico.
    • Uma vez que tudo é feito, escrever o resultado na tabela de resultados.
  • Confirmar a transação ou reversão se algo falhar.

Meu problema é que se eu tiver 2 usuários que iniciam o processo, o segundo terá que esperar que o anterior tenha terminado (porque a inserção parece colocar um bloqueio exclusivo sobre a mesa) e meu aplicativo, por vezes, cai no tempo limite (eo os usuários não estão felizes esperar :)).

Eu estou procurando uma maneira de ser capaz de ter os usuários que faz tudo em paralelo, como não há interação, exceto o último: escrever o resultado. Eu acho que o que está a bloquear-me é as inserções / exclusões na tabela LoadData. Eu verifiquei os outros níveis de isolamento de transação, mas parece que nada poderia me ajudar.

O que seria perfeito seria para ser capaz de remover o bloqueio exclusivo na tabela LoadData (é possível forçar SqlServer apenas bloquear linhas e não mesa?) Quando o Insert está terminado, mas sem terminar a transação.

Alguma sugestão?

Publicado 09/12/2008 em 14:38
fonte usuário
Em outras línguas...                            


3 respostas

votos
1

se você tem certeza que não há nenhum problema com operações cioncurrent exceto a última parte, por que não começar a transação pouco antes essas últimas declarações, Qualquer que seja o que eles são que exigem isolamento), e comprometer-se imediatamente após a ter sucesso .. Então toda a inicial operações de leitura não vai bloquear o outro ...

Respondeu 09/12/2008 em 15:24
fonte usuário

votos
1

Olhe para cima SET TRANSACTION ISOLATION LEVEL LEIA INSTANTÂNEO cometidos em Books Online.

Respondeu 09/12/2008 em 15:04
fonte usuário

votos
1

As transações devem cobrir pequenas e execução rápidas pedaços de SQL / code. Eles têm uma tendência a ser implementado de forma diferente em diferentes plataformas. Eles vão bloquear tabelas e, em seguida, expandir o bloqueio como as modificações crescer, assim, bloqueando os outros usuários de consulta ou atualizar a mesma linha / page / mesa.

Por que não esquecer a transação, e lidar com erros de processamento de outra maneira? É a integridade dos dados verdadeiramente sendo protegido pela transação, ou você pode fazer sem ele?

Respondeu 09/12/2008 em 14:43
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more