Ho una .net web page in cui vengono chiamati due proc memorizzati. Entrambi hanno una transazione di commit iniziale in SQL Server. Inoltre sto chiamando il secondo proc più volte a seconda di alcune condizioni.
Voglio racchiudere l'intero processo in un'unica transazione. Mi sono guardato intorno e ho trovato che le clas Sqltransaction e TransactionScope in C # mi aiutano in questa situazione.
Ma non li ho mai usati, li uso sempretransazione in SQL Server, quindi non so se le transazioni in .Net avranno problemi in quanto entrambi i miei proc memorizzati hanno la propria transazione Begin-commit in Sql Server.
Se fanno conflitto c'è un modo per farli lavorare con una singola transazione?
risposte:
1 per risposta № 1Sì, è possibile chiamare (ad es. Esistenti o legacy) Processi memorizzati da .Net che utilizzano il manuale BEGIN TRAN
, COMMIT TRAN
/ ROLLBACKs
sotto un .Net TransactionScope
, o se gestisci la transazione da a SqlTransaction
. (Anche se per affermare l'ovvio, se è possibile evitare l'utilizzo di più tecnologie di transazione, farlo).
Per lo scenario "caso felice", ciò che accadrà è che il @@TRANCOUNT
sarà aumentato quando il SPROC
le transazioni vengono chiamate (proprio come per le transazioni nidificate in SqlServer). Le transazioni vengono effettuate solo quando @@TRANCOUNT
raggiunge zero dopo il commit più esterno sulla connessione. cioè inner commits
semplicemente diminuirà @@TRANCOUNT
. Si noti tuttavia che lo stesso non è vero per ROLLBACKS
- a meno che tu non stia usando punti di salvataggio, qualsiasi rollback eseguirà il rollback dell'intera transazione. Dovrai stare molto attento a trovare le corrispondenze @@TRANCOUNTs
.
Sembri un po 'indeciso TransactionScope
vs SqlTransaction
. TransactionScope
è più versatile, in quanto può comprendere sia transazioni monofase che distribuite (utilizzando DTC
). Tuttavia, se hai solo bisogno di coordinare la transazione su una singola connessione, stesso database, allora SqlTransaction
andrebbe anche bene