2012-02-14 84 views
0

我们在服务器上使用应用程序与Sql服务器并且它从客户端接收许多SDF文件来更新SqlServer Data Base许多表的更新,我使用Transaction来处理服务器中的应用程序多个用户比可能在同一时间进行两次更新,并且两个用事务,应用程序抛出一个异常,该表被另一个事务使用!许多交易在同一个表中

由于会话中还有其他线程正在运行,因此不允许新的事务。

并且用户还有其他任务在应用程序中执行交易,目前如果有更新,他必须等到它完成。

任何想法?

更新:有我fonction一些代码:这是我fonctions与交易中的BackgroundWorker与定时器运行:

  DbTransaction trans = ConnectionClass.Instance.MasterConnection.BeginTransaction(); 
      try 
      { 
      ClientDalc.UpdateClient(ChosenClient, trans); 
      // other functions with the same transaction    

      trans.Commit(); 
      } 
      catch (Exception ex) 
      { 
       trans.Rollback(); 
       return false; 
      } 

更新客户端:

 public static bool UpdateClient(ClientEntity ChosenClient, DbTransaction trans) 
    { 

     bool retVal = true; 
     string sql = "UPDATE ClientTable Set ........"; 



     try 
     { 
      using (DbCommand cmd = DatabaseClass.GetDbCommand(sql)) 
      { 
       cmd.Transaction = trans; 
       cmd.Parameters.Add(DatabaseClass.GetParameter("@Name", Client.Name)); 
       // 
       cmd.ExecuteNonQuery(); 
      } 
     } 
     catch (Exception ex) 
     { 
      retVal = false; 
     } 

     return retVal; 
    } 

如果我运行其他任何东西在同时BackgroundWorker正在进行中我得到的例外甚至不是交易

ExecuteReader requi当分配给命令的连接处于未决的本地事务中时,请使命令保留一个事务。该命令的Transaction属性尚未初始化。“

+2

什么异常? – Richard 2012-02-14 09:22:02

+1

另一个事务使用的表 – Akrem 2012-02-14 09:28:43

+0

您可以最初将原始SDF插入“待定”表中,然后让另一个进程逐个处理这些表,以确保您一次只能执行一次。真的,尽管这听起来像是它做你想做的事情。通过事务锁定表,直到它完成,然后再次释放它。 – Chris 2012-02-14 10:01:27

回答

1

这是一个完全borked的发布?

我发现该错误的唯一参考指向实体框架,而不是SQL服务器,我从来没有在SQL服务器上看到过 - 事实上,sql服务器根本就没有恰当的会话概念。他们在那里被称为Conenctions。

SqlException from Entity Framework - New transaction is not allowed because there are other threads running in the session

在这种情况下,您的描述和标签,使ZERO感和酮基的答案是正确使用的EntityFramework - 即不是多线程。每个线程打开单独的会话。

+0

每个线程打开单独的会话?以及如果我需要在同一时间与很多用户进行交易更新,我必须做些什么? – Akrem 2012-02-14 10:38:25

+0

您有分散的交易。让数据库完成他们的工作。像所有其他人一样。你认为多用户数据库是如何工作的?事务隔离iscore-和多个更新同时在一个tarnsaction中隔离。 – TomTom 2012-02-14 10:41:23

+0

@Akrem我建议你阅读“工作单元”模式:这是EF会议遵循的内容。 – Richard 2012-02-14 14:33:39

0

尝试按照C#示例代码

using (SqlConnection con = new SqlConnection("Your Connection String")) 
{ 
    using (SqlCommand cmd = new SqlCommand("Your Stored Procedure Name", con)) 
    { 
     SqlParameter param = new SqlParameter(); 
     param.ParameterName = "Parameter Name"; 
     param.Value = "Value"; 
     param.SqlDbType = SqlDbType.VarChar; 
     param.Direction = ParameterDirection.Input; 
     cmd.Parameters.Add(param); 
     cmd.ExecuteNonQuery(); 
    } 
} 

尝试按照示例存储过程


建议

  1. 保持您的交易尽可能短。
  2. 在表中添加记录时,它肯定会锁定资源,直到事务完成。所以其他用户肯定会等待。
  3. 在更新的情况下,您可以使用并发控制
相关问题