将TransactionScopes与MVC4一起使用的正确方法是什么?

时间:2013-09-12 19:35:00

标签: c# asp.net-mvc-4 entity-framework-5

我正在为每个请求使用一个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 个答案:

答案 0 :(得分:0)

AFAIK,在L2S中调用SubmitChanges时,LINQ to SQL会检查调用是否在Transaction的范围内,或者是否将Transaction属性(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();
 }