5

Linq to Entities で System.Transactions.TransactionScope を使用する価値はありますか?

MS のドキュメントでは、ObjectContext.SaveChanges() 内の SQL 呼び出しはすべて内部的に 1 つのトランザクションにまとめられると書かれています。

ファイル システム上のローカル SQLite データベースである 1 つのデータベース接続があります。データベースに対するすべての操作がアトミックであることを確認したいだけですが、TransactionScope は必要ですか? IE では、いくつかの削除、更新、挿入などを呼び出す場合、それらすべてを実行するか、まったく実行しないことを望んでいます。

4

3 に答える 3

3

ジョン、いいえ、TransactionScope を使用する必要はありません。オプティミスティック コンカレンシーは、Linq によって自動的に処理されます。あなたが提供するリンクのコードサンプルは、トランザクションを自分でロールバックする必要がないことをかなりうまく説明しています。サンプルと同じコードを使用します。

    try
    {
        // Try to save changes, which may cause a conflict.
        int num = context.SaveChanges();
        Console.WriteLine("No conflicts. " +
            num.ToString() + " updates saved.");
    }
    catch (OptimisticConcurrencyException)
    {
        // Resolve the concurrency conflict by refreshing the 
        // object context before re-saving changes. 
        context.Refresh(RefreshMode.ClientWins, orders);

        // Save changes.
        context.SaveChanges();
        Console.WriteLine("OptimisticConcurrencyException "
        + "handled and changes saved");
    }

あなたの懸念を処理する更新、再保存に注意してください。これは、try ブロック内から例外をスローすることでテストできます。

よろしくお願いします

于 2010-03-02T15:17:38.950 に答える
1

複数の を 1 つのトランザクションに含めたい場合ObjectContext.SaveChanges(変更するデータの読み取りや変更など) は、 を使用する必要がありますTransactionScope

于 2010-03-02T15:14:40.357 に答える
0

Richard の言うことを実行する必要がある場合は、次のコードを使用できます (可能性は低いと思われますが)。

TransactionManager transactionManager = null;

try
{
    bool isBorrowedTransaction = ConnectionScope.Current.HasTransaction;
    transactionManager = ConnectionScope.ValidateOrCreateTransaction(true);

    //MANY SAVES

    if (!isBorrowedTransaction && transactionManager != null && transactionManager.IsOpen)
        transactionManager.Commit();
}
catch (Exception ex)
{
    if (transactionManager != null && transactionManager.IsOpen)
        transactionManager.Rollback();
    log.Error("An unexpected Exception occurred", ex);
    throw;
}
于 2010-03-02T15:23:51.887 に答える