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 № 1Sim, é 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.