数据库在SELECT操作中卡住
本文关键字:操作 SELECT 数据库 | 更新日期: 2023-09-27 18:29:47
我在应用程序中使用MS Sql数据库,当我从数据库中执行SELECT操作时,它会停滞几分钟。而且每天都会发生几次。所有其他选择只需几秒钟。
我还注意到,如果我在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();
}
我认为您的读取器值被分配给了错误的变量。
尝试更改:
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);
这很可能是因为锁。如果另一个事务正在写入Parts表,则您的选择需要等待。
零件表有多大?这可能会导致性能问题。或者它可能是另一个事务锁定在您之前。
其他事项:
-
当使用完成连接、命令和读取器时,请调用dispose
-
参数化第二个查询,而不是字符串连接。由于Sql Server内部的工作方式,它更安全,性能也显著提高。
- minor:如果您要查看数千个项目,请使用StringBuilder而不是串联