【发布时间】:2012-02-21 17:40:36
【问题描述】:
我们将服务器中的应用程序与 Sql 服务器一起使用,它从客户端接收许多 SDF 文件来更新 SqlServer 数据库,更新许多表,我为此使用 Transaction,服务器中的应用程序由多个用户使用,而不是可能两个更新同时进行,并且两个带有事务,应用程序抛出一个异常,该表被另一个事务使用!
不允许新事务,因为会话中还有其他线程在运行。
并且用户在应用程序中也有其他任务要做交易,目前如果有更新,他必须等到它完成。
有什么想法吗?
更新:我的函数有一些代码:这是我在 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 要求该命令具有事务。该命令的 Transaction 属性尚未初始化。”
【问题讨论】:
-
另一个事务使用的表
-
您最初可以将原始 SDF 插入“待处理”表,然后让另一个进程逐个处理这些数据,以确保您一次只执行一个。真的,虽然这听起来像是在做你想做的事。通过事务锁定表,直到完成,然后再次释放。
-
@Chris:我使用很多表,而不是使用平移表,我认为这不会有帮助
标签: c# sql-server-2008 transactions