数据库在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();                    
            }

数据库在SELECT操作中卡住

我认为您的读取器值被分配给了错误的变量。

尝试更改:

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而不是串联