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 调用但是,我遇到了一些罕见的高负载死锁异常。所以,我做得对吗?还是最好为每个操作打开一个 TransactionScope?(但如果其中一个操作失败,我需要回滚所有操作。)

谢谢你。

4

1 回答 1

0

AFAIK,在 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 回答