任何人都可以建议我这段代码是否会导致并发。
这是一个在表单中使用的静态类,用于某些数据库事务。
这涉及从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;
}
}
答案 0 :(得分:1)
由于您已经定义了静态SQLConnection,我相信它可能会导致并发问题。
static SqlConnection con = new SqlConnection (ConfigurationManager.ConnectionStrings["sqlserverconnectionstring"].ConnectionString);
如果两个不同的对象尝试运行查询,它们将在同一个sql连接对象实例上运行它们。
答案 1 :(得分:1)
是的,这不是线程安全的/但是,由于SqlClient默认使用连接池,你可以放弃静态连接,并让每个用法做类似的事情:
using(var conn = OpenConnection()) {
...//code
}
OpenConnection
每次都会返回新 SqlConnection
。这与每次不同的底层连接不同,并且您通常(在winform中)找到使用的连接数非常少(如果您真的很幸运,则为1)。