2

「現在の接続に関連付けられているトランザクションは完了しましたが、破棄されていません。接続を使用して SQL ステートメントを実行するには、トランザクションを破棄する必要があります。」という例外が発生します。TransactionScope を使用して、UpdateItem サブルーチンへの複数の呼び出しで発生する多数の DB 更新をラップする場合。このエラーの意味と、foreach 内の何かが失敗した場合 (例外をスローした場合) にロールバックする機能を保持しながら、コードを再構築する正しい方法を誰かが理解するのを助けることができますか?

static void Foo()
{    
    using (TransactionScope transactionScope = new TransactionScope())
    {
        foreach (var item in items)
        {
            UpdateItem(item);
        }

        transactionScope.Complete(); 
    }
}


static void UpdateItem(string item)
{
    using (MyDataContext db = new MyDataContext)
    {
        :
    :
    db.Table1.InsertOnSubmit();
    :
    db.SubmitChanges();
    :
    :
    db.ExecuteCommand(); // I get the exception here
    :
    db.Table2.InsertOnSubmit();
    :
    db.SubmitChanges();
    :   
    }
}
4

1 に答える 1

0

ATransactionScopeにはタイムアウトがあります。それがヒットすると、トランザクションはロールバックされます。より大きなタイムアウト値を指定してください。

于 2012-08-27T20:26:49.350 に答える