1

リクエストごとに 1 つの TransactionScope を使用しています。次のようになります。

public ActionResult Login(string user, string pass)
{
    using (ServerContext context = new ServerContext ())
    {
        TransactionOptions transOptions = new TransactionOptions();
        transOptions.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
        transOptions.Timeout = TransactionManager.MaximumTimeout;

        using (var scope = new TransactionScope(TransactionScopeOption.Required, transOptions))
        {
           // Some logic and Linq queries here
        }
}

トランザクション スコープ内でいくつかの挿入、更新、削除、および proc 呼び出しを実行しましたが、高負荷でまれに DeadLock 例外が発生しました。それで、私はそれを正しくやっていますか?それとも、操作ごとに TransactionScope を開く方がよいでしょうか? (ただし、セットの 1 つが失敗した場合は、すべての操作をロールバックする必要があります。)

ありがとうございます。

4

1 に答える 1

0

私の知る限り、L2S で SubmitChanges を呼び出すと、LINQ to SQL は呼び出しがトランザクションのスコープ内にあるかどうか、またはトランザクション プロパティ (IDbTransaction) がユーザーが開始したローカル トランザクションに設定されているかどうかを確認します。どちらのトランザクションも見つからない場合、LINQ to SQL はローカル トランザクション (IDbTransaction) を開始し、それを使用して生成された SQL コマンドを実行します。すべての SQL コマンドが正常に完了すると、LINQ to SQL はローカル トランザクションをコミットして戻ります。

MVC/EF についてのアイデアはありませんが、次のようにラップしてみてください。

 using (var scope = new TransactionScope(TransactionScopeOption.RequiresNew))
 {
     using (ServerContext context = new ServerContext ())
     {


           // Some logic and Linq queries here
     }
     scope.Complete();
 }
于 2013-09-12T19:38:42.053 に答える