Имам .net уеб страница, в която се извикват две съхранявани проци. И двете от тях започват да извършват транзакция в sql сървър. Също така наричам втория прок няколко пъти, в зависимост от някои, ако условията.
Искам да обвържа целия този процес с една транзакция. Огледах се и намерих Sqltransaction и TransactionScope класове в C # ще ми помогне в тази ситуация.
Но аз никога не съм ги използвал, винаги използвамтранзакция в sql сървър и затова не знам дали транзакциите с .Net ще имат проблеми, тъй като и двата мои съхранявани прокси имат собствена транзакция Begin-commit в Sql Server.
Ако има конфликт, има ли начин да ги накараме да работят при една транзакция?
Отговори:
1 за отговор № 1Да, възможно е да извикате (например съществуващи или наследени) съхранявани прокти от .Net, които използват ръчно BEGIN TRAN
, COMMIT TRAN
/ ROLLBACKs
под .Net TransactionScope
, или ако управлявате транзакцията от a SqlTransaction
, (Въпреки че, за да посочите очевидното, ако можете да избегнете използването на няколко транзакционни технологии, направете това).
За сценария "щастлив случай", какво ще се случи е, че @@TRANCOUNT
ще се увеличи, когато SPROC
се нареждат транзакции (точно както при вложени транзакции в SqlServer). Транзакциите се извършват само когато @@TRANCOUNT
натиска нула след свързването на най-външната връзка към връзката. т.е. inner commits
ще намалее @@TRANCOUNT
, Обърнете внимание обаче, че същото не е вярно за ROLLBACKS
- освен ако не използвате точки на запис, всяко връщане назад ще доведе до връщане на цялата транзакция. Трябва да бъдете много внимателни, за да се съберете @@TRANCOUNTs
.
Звучиш малко нерешен TransactionScope
срещу SqlTransaction
. TransactionScope
е по - гъвкав, тъй като може да обхваща както еднофазови, така и разпределени транзакции (използвайки DTC
). Ако обаче трябва само да координирате транзакцията по единична връзка, същата база данни, тогава SqlTransaction
би било добре.