Nós realmente exigimos manipulação de transações em c #, bem como processo de armazenamento de banco de dados em ambos os lados
C#:
Using(transaction with transaction scope)
{
Execute stored proc;
Transaction. Complete;
}
Procedimento armazenado SQL:
Create process
As
Begin try
Begin transaction
Commit
End try
Begin catch
Rollback
End catch
Em primeiro lugar , você deve sempre ter tratamento de transação adequado em todos os seus procedimentos, para que não importe se eles são chamados pelo código do aplicativo, por outro procedimento, individualmente em uma consulta ad-hoc, por um trabalho do SQL Agent ou por algum outro meio . Mas declarações DML únicas, ou código que não faz nenhuma modificação, não precisa de uma transação explícita. Então, o que estou recomendando é:
Ao fazer 2 ou mais instruções DML, você precisa usar algo como o seguinte (o que também pode ser feito para operações DML únicas, se preferir ser consistente):
Ao fazer apenas 1 instrução DML ou apenas um SELECT, você pode fazer o seguinte:
Em segundo lugar , você deve manipular a transação na camada de aplicativo apenas se precisar executar mais de 1 consulta/procedimento armazenado e todos eles precisarem ser agrupados em uma operação atômica. Fazer um single
SqlCommand.Execute___
só precisa estar em um try/catch, mas não em uma Transaction.Mas, dói fazer uma transação na camada do aplicativo ao fazer apenas uma única chamada? Se exigir MSDTC (coordenador de transações distribuídas da Microsoft), será um pouco mais pesado para o sistema fazer isso na camada do aplicativo quando não for expressamente necessário. Pessoalmente, prefiro evitar transações baseadas em camada de aplicativo, a menos que seja absolutamente necessário, pois reduz o potencial de transações órfãs (se algo der errado com o código do aplicativo antes de fazer a confirmação ou reversão). Também descobri que às vezes torna a depuração de certas situações um pouco mais difícil. Mas, dito isso, não vejo nada tecnicamente errado em também lidar com a transação na camada do aplicativo ao fazer um único processoligar; novamente, uma única instrução DML é sua própria transação e não precisa de nenhum tratamento de transação explícito em nenhuma das camadas.