0

次のことを考慮してください。

using (var outerScope = new TransactionScope())
{
    InsertDataInTableOne();
    InsertDataInTableTwo();
    InsertDataInTableThree();
    outerScope.Complete();
}

ここで、トランザクションInsertDataInTableOneの外部で実行する必要があります。outerScopeこれは単純化された表現ですTransactionScope。チェーンの複数の呼び出しが作成されるためInsertDataInTableOne、作成の外部に呼び出しを置くことはできませんTransactionScope

また、これは良い習慣ではないかもしれないことも知っており、私たちはまともな修正に取り組んでいます。しかし、現時点ではこの迅速な修正が必要です。

using (var outerScope = new TransactionScope())
{
    using (var innerScope = new TransactionScope(TransactionScopeOption.RequiresNew))
    {
        InsertDataInTableOne();
        innerScope.Complete();
    }
    InsertDataInTableTwo();
    InsertDataInTableThree();
    outerScope.Complete();
}

それはうまくいきませんでした。最初にwithを作成し、次にTransactionScope。を作成してみました。SuppressRequiresNew

それで、あなたが?にいるという事実を事実上無視して、データベースにすぐにデータを挿入することは可能TransactionScopeですか?

接続はこれらのメソッドの外部で行われます(実際には、呼び出されるサービスに入るとき)。

4

1 に答える 1

0

これが誰かを助けるかどうかはわかりませんが、あなたは決して知りません。問題は、カスタムの会社フレームワークにあります。実装により、ネストされたトランザクションを持つことが難しくなると私は信じています。外側のトランザクション(数層上)を削除し、ブロック内に2つの別個のトランザクションを作成することで、これを修正しました。

using (var scopeOne = new TransactionScope())
{
    InsertDataInTableOne();
    scopeOne.Complete();
}

using (var scopeTwo = new TransactionScope())
{
    InsertDataInTableTwo();
    InsertDataInTableThree();
    scopeTwo.Complete();
}

繰り返しますが、これは私たちのコードに非常に固有のソリューションです。通常、を使用RequiresNewするとうまくいくはずです。したがって、それが機能しない場合は、最初に自分のコードを調べてください;)

私がdo-it-all-company-frameworksの大ファンではないもう1つの理由。

于 2013-02-06T15:31:01.297 に答える