/ / 1つのトランザクションの下で.Netの複数の格納されたproc呼び出し - c#、asp.net、sql-server、transactions、transactionscope

1つのトランザクション - C#、asp.net、sql-server、transactions、transactionscopeの下で.Net内の複数の格納されたproc呼び出し

私は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.

あなたは少し不安を耳にする TransactionScopeSqlTransaction. TransactionScope 単相トランザクションと分散トランザクションの両方にまたがることができる点で、より汎用性があります( DTC)。ただし、単一の接続、同じデータベースでトランザクションを調整する必要がある場合のみ SqlTransaction また大丈夫だろう。