【问题标题】:Many transactions in the same tables,同一张表中的许多事务,
【发布时间】: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


【解决方案1】:

这是一个完全无聊的帖子吗?

我发现该错误的唯一参考指向实体框架,而不是 Sql server,我在 sql server 中从未见过 - 事实上,sql server 根本没有合适的会话概念。它们在那里被称为连接。

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

在这种情况下,您的描述和标记是零意义的,唯一的答案是正确使用 EntityFramework - 即不是多线程的。每个线程打开单独的会话。

【讨论】:

  • 为每个线程打开单独的会话?如果我需要同时与多个用户更新交易,我该怎么办?
  • 您有独立的交易。并让数据库完成他们的工作。像所有其他人一样。你认为多用户数据库是如何工作的?事务隔离是在一个 tarnsaction 中同时进行的多个更新和多个更新将其隔离。
  • @Akrem 我建议您阅读“工作单元”模式:这是 EF 会话所遵循的。
【解决方案2】:

尝试遵循示例 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();
    }
}

尝试遵循示例存储过程

Create Proc YourStoredProcedureName
@ParameterName DataType(Length)
As
Begin
   Set NoCount On
   Set XACT_ABORT ON
   Begin Try
      Begin Tran
         //Your SQL Code...
      Commit Tran 
   End Try

   Begin Catch
      Rollback Tran
   End Catch
End

建议

  1. 尽可能缩短交易时间。
  2. 当你在表中添加一条记录时,它肯定会锁定资源,直到事务完成。因此,其他用户肯定需要等待。
  3. 在更新的情况下,您可以使用并发控制

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 1970-01-01
    • 2021-07-31
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    相关资源
    最近更新 更多