/ / Múltipla chamada proc armazenada em .net sob 1 transação - c #, asp.net, sql-server, transações, transactionscope

Múltiplas chamadas de proc armazenadas em .Net sob 1 transação - c #, asp.net, sql-server, transações, transactionscope

Eu tenho uma página web .net na qual dois procs armazenados são chamados. Ambos têm transação begin-commit no sql server.Also eu estou chamando o segundo proc várias vezes dependendo de algumas condições if.

Eu quero envolver todo esse processo em uma única transação. Eu olhei ao redor e encontrei clases Sqltransaction e TransactionScope em C # me ajudará nessa situação.

Mas eu nunca usei eles, sempre usotransação no sql server e, portanto, não sei se as transações no .net terão problemas como meus procs armazenados têm sua própria transação Begin-commit no Sql Server.

Se eles estão em conflito, existe uma maneira de fazê-los funcionar sob uma única transação?

Respostas:

1 para resposta № 1

Sim, é possível chamar (por exemplo, existente ou legado) Stored Procs de .Net que usam manual BEGIN TRAN, COMMIT TRAN / ROLLBACKs sob um .net TransactionScope, ou se você gerenciar a transação de um SqlTransaction. (Embora para declarar o óbvio, se você puder evitar o uso de várias tecnologias de transação, faça isso).

Para o cenário do "caso feliz", o que acontecerá é que o @@TRANCOUNT será aumentado quando o SPROC transações são chamadas (assim como por transações aninhadas no SqlServer). As transações só são confirmadas quando @@TRANCOUNT atinge zero após o commit mais externo na conexão. isto é inner commits vai simplesmente diminuir @@TRANCOUNT. Note, no entanto, que o mesmo não é verdade ROLLBACKS - a menos que você esteja usando SAVEPOINTS, qualquer reversão reverterá a transação inteira. Você precisará ter muito cuidado ao combinar @@TRANCOUNTs.

Você parece um pouco indeciso sobre TransactionScope vs SqlTransaction. TransactionScope é mais versátil, pois pode abranger transações monofásicas e distribuídas (usando DTC). No entanto, se você precisar coordenar a transação em uma única conexão, o mesmo banco de dados, SqlTransaction também ficaria bem.