同一个表中的许多交易,

时间:2012-02-14 09:18:05

标签: c# sql-server-2008 transactions

我们在服务器上使用应用程序与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属性尚未初始化。“

2 个答案:

答案 0 :(得分:1)

这是一个完全笨拙的帖子吗?

我发现该错误的唯一引用指向实体框架,而不是Sql服务器,我在sql server中从未见过 - 事实上,sql server根本没有适合会话的设施。他们在那里被称为Conenctions。

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

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

答案 1 :(得分: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();
    }
}

尝试按照示例存储过程

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. 如果更新,您可以使用并发控制