我們在服務器上使用應用程序與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屬性尚未初始化。「
什麼異常? – Richard 2012-02-14 09:22:02
另一個事務使用的表 – Akrem 2012-02-14 09:28:43
您可以最初將原始SDF插入「待定」表中,然後讓另一個進程逐個處理這些表,以確保您一次只能執行一次。真的,儘管這聽起來像是它做你想做的事情。通過事務鎖定表,直到它完成,然後再次釋放它。 – Chris 2012-02-14 10:01:27