私は2つの格納されたprocsが呼び出される.net Webページを持っています。 これらの両方は、SQL Server.Alsoでbegin-commitトランザクションを持っていますが、いくつかのif条件に応じて、2回目のprocを複数回呼び出しています。
私は単一のトランザクションの下でこの全プロセスを包み込みたい。私は周りを見て、C#でこの状況で私を助けるSqltransactionとTransactionScopeのクローズが見つかりました。
しかし、私はそれらを使用したことはありません、常に使用SQL Serverでのトランザクションであるため、両方のストアドプロシージャがSQL Serverで独自のBegin-commitトランザクションを持つため、.Netのトランザクションに問題があるかどうかはわかりません。
彼らが矛盾している場合は、単一のトランザクションでそれらを動作させる方法がありますか?
回答:
回答№1は1はい。マニュアルを使用している.NetからStored Procs(たとえば、既存のものまたは従来のもの)を呼び出すことは可能です BEGIN TRAN
, COMMIT TRAN
/ ROLLBACKs
ネットの下で TransactionScope
、またはトランザクションを管理している場合 SqlTransaction
。 (明らかに、複数のトランザクションテクノロジの使用を避けることができますが、そうすることもできます)。
「ハッピーケース」のシナリオでは、 @@TRANCOUNT
が増加する SPROC
トランザクションが呼び出されます(SqlServerのネストされたトランザクションと同様)。トランザクションは、 @@TRANCOUNT
接続上の一番外側のコミットの後で0になります。すなわち、 inner commits
単純に減少する @@TRANCOUNT
。ただし、同じことは ROLLBACKS
- あなたが使っていない限り SAVEPOINTSすべてのロールバックはトランザクション全体をロールバックします。マッチングを慎重にする必要があります @@TRANCOUNTs
.
あなたは少し不安を耳にする TransactionScope
対 SqlTransaction
. TransactionScope
単相トランザクションと分散トランザクションの両方にまたがることができる点で、より汎用性があります( DTC
)。ただし、単一の接続、同じデータベースでトランザクションを調整する必要がある場合のみ SqlTransaction
また大丈夫だろう。