Luiz Gustavo,
Desculpe a demora...
Independente de como você vai estruturar o código da tua aplicação, me parece que vc tem um problema em como o banco é acessado.
A questão é que o SQL Server tem um péssimo modelo de concorrência (pelo menos até a versão 2005, não sei se depois disso melhorou, não consegui me aprofundar nos estudos).
A questão é a seguinte: Quando uma transação é aberta no SQL Server, ele marca o registro na página de dados como lockado e tira um "backup" dele no logfile. Enquanto vc altera o registro, ele mexe direto no arquivo de dados. Se vc dá um commit na transação, ele desmarca o "lockado" e limpa o logfile. Se vc dá um rollback ele pega os dados do logfile e salva na página de dados. Mesmo q vc não use uma transação, dê apenas um update ou um insert, internamente o SQL usa o conceito de "transação implícita" e está criando trabalhando com o lock da forma descrita acima.
Quando um usuário está dando um "select" num registro com lock, em geral ele vai esperar o fim da transação pra poder dar a resposta.
Acredito que no "snapshot isolation" isso mude, mas nunca vi isso funcionando num cenário real de carga e concorrência pra poder te dizer se é bom ou não.
Outros bancos como o Oracle (na versão 8.0.5, em 1998 já era assim) tem o conceito de "rollback segment". Quando vc abre uma transação, ele escreve os dados modificados no rollback segment, deixando a página de dados livre para ser lida. Qualquer select (mesmo read commited) não espera o término da transação.
Em resumo, no teu problema o processo pesado fica atualizando e os demais ficam esperando porque estão buscando ler registros commitados. Vc duas saídas: perder consistência e usar dirty read (o famoso "NoLock") ou replanejar a forma de atualizar o seu banco, fazer atualizações menores.
Tem mais um ingrediente pra complicar isso ainda... o SQL tem um mecanismo de "escalar" locks, ou seja, se vc manda lockar um registro, ele locka apenas o registro. Se muitos registros próximos estão lockados, ele locka toda a página de dados. Se muitas páginas de dados estão lockadas, ele locka toda a tabela. Se acontece isso em produção, é uma delícia para debugar...
O mesmo vale para índices.
Como existe esse mecanismo de atualizar direto na página, o SQL Server gera locks para leituras. Ou seja, enquanto alguém tá lendo o dado, outro não pode atualizar. Em outras palavras, ele gera lock para select. Eu já tive o desprazer de ver deadlock em selects com SQL Server por causa de locks de leitura em casos em que um select precisa de um índice mais dos dados, o outro dos dados depois do índice. É insano.
Espero ter ajudado.
Abraço,
Eric