静态类中的冲突

本文关键字:冲突 静态类 | 更新日期: 2023-09-27 18:28:42

有人能告诉我这段代码是否会导致并发吗。

这是一个在表单和中使用的静态类,用于某些数据库事务。

这涉及到从asp.net页面调用静态函数,并将参数作为ref类型传递。

我正在使用引用类型。

因为它是基于web的,所以它会创建一些并发性吗。///

这是我的示例类中的代码。

public static class DataClass
{
  static SqlConnection con = new SqlConnection(
      ConfigurationManager.ConnectionStrings["sqlserverconnectionstring"]
                                                .ConnectionString);
    public static string  GetCon()
    {
     return ConfigurationManager.ConnectionStrings["sqlserverconnectionstring"].ConnectionString;
    }
    public static void Conn(ref SqlConnection con)
    {
        if (con.State == ConnectionState.Closed)
        {
            con.Open();
        }
    }
    public static DataSet GetDataSet(string qry)
    {
        SqlDataAdapter adp = new SqlDataAdapter(qry, con);
        DataSet ds = new DataSet();
        adp.Fill(ds);
        return ds;
    }
    public static bool ExecuteCommand(ref SqlCommand cmd)
    {
        bool i =true;
        cmd.Connection = con;
        Conn(ref con);
        SqlTransaction trans =con.BeginTransaction(); 
        cmd.Transaction = trans;
        try
        {
            cmd.ExecuteNonQuery();
            trans.Commit();
        }
        catch
        {
            trans.Rollback();
            i = false;
        }
        finally
        {
            cmd.Dispose();
            con.Close(); 
        }
        return i;
    }
}

静态类中的冲突

由于您定义了一个静态SQLConnection,我认为它可能会导致并发问题。

static SqlConnection con = new SqlConnection (ConfigurationManager.ConnectionStrings["sqlserverconnectionstring"].ConnectionString);

如果两个不同的对象尝试运行查询,它们将在sql连接对象的同一实例上运行。

是的,这不是线程安全的/但是,由于SqlClient默认使用连接池,因此您可以删除静态连接,并让每次使用都执行以下操作:

using(var conn = OpenConnection()) {
    ...//code
}

其中CCD_ 1每次返回一个新的CCD_。这与每次使用不同的底层连接不同,并且您通常(在winform中)会发现使用的连接数量非常少(如果您真的很幸运,则为1)。