我在我的应用程序中使用MS Sql数据库,当我从数据库执行SELECT操作时,它会停留几分钟。 它每天都会发生几次。所有其他SELECTS只需几秒钟。
此外,我注意到在SELECT操作正在进行时是否关闭应用程序。它在任何下一个应用程序启动时都无法正常工作直到我重新启动数据库引擎......
为什么会这样?
以下是代码段:
using (SqlConnection myConnection = new SqlConnection(connString))
{
myConnection.Open();
SqlCommand command = myConnection.CreateCommand();
SqlTransaction transaction;
transaction = myConnection.BeginTransaction("LockTransaction");
command.Connection = myConnection;
command.Transaction = transaction;
try
{
int recordsAtOnce = maxToLock;
command.CommandText =
"SELECT TOP 1000 id, productName from Parts WHERE part_used is NULL;";
List<string> idList = new List<string>();
SqlDataReader myReader = command.ExecuteReader(CommandBehavior.Default);
while (myReader.Read())
{
string id = myReader.GetString(1);
string name = myReader.GetInt32(0).ToString();
idList.Add(id);
}
myReader.Close();
string idsStr = "";
for(int i = 0; i < idList.Count; i++)
{
if (i != 0)
{
idsStr += ", ";
}
idsStr += idList[i];
}
// lock record
command.CommandText = "UPDATE Parts SET part_used=\'rt\' WHERE id in (" + idsStr + ")";
command.Parameters.Clear();
command.CommandType = CommandType.Text;
command.ExecuteNonQuery();
transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
}
答案 0 :(得分:3)
我认为您的读者价值被分配给错误的变量。
尝试更改:
string id = myReader.GetString(1);
string name = myReader.GetInt32(0).ToString();
idList.Add(id);
要:
string id = myReader.GetInt32(0);
string name = myReader.GetString(1).ToString();
idList.Add(id);
答案 1 :(得分:2)
这很可能是因为锁定。如果另一个事务写入Parts表,则您的select需要等待。
答案 2 :(得分:0)
零件表有多大?这可能会导致性能问题。或者它可能是你之前锁定的另一个事务。
其他事项:
使用
参数化第二个查询而不是字符串连接。由于Sql Server在内部的工作方式,它更安全,性能更高。