静态类中的冲突
本文关键字:冲突 静态类 | 更新日期: 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)。