2012-02-14 81 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. 在更新的情況下,您可以使用併發控制