【问题标题】:Database gets stuck on SELECT operation数据库卡在 SELECT 操作上
【发布时间】:2012-04-17 04:33:19
【问题描述】:

我在我的应用程序中使用 MS Sql 数据库,当我从数据库执行 SELECT 操作时,它会卡住几分钟。 它每天发生几次。所有其他 SELECTS 只需要几秒钟。

我还注意到,如果我在 SELECT 操作正在进行时关闭了应用程序。在我重新启动数据库引擎之前,它在任何下一个应用程序启动时都无法正常工作......

为什么会这样?

这里是sn-p的代码:

        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();                    
            }

【问题讨论】:

  • 您的Parts 表是否在part_used 上编入索引?这将避免表扫描。在没有指定ORDER 的情况下使用TOP 子句是很不寻常的。

标签: c# sql-server select


【解决方案1】:

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

尝试改变:

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);

【讨论】:

    【解决方案2】:

    这很可能是因为锁。如果另一个事务正在写入 Parts 表,您的 select 需要等待。

    【讨论】:

      【解决方案3】:

      零件表有多大?这可能会导致性能问题。或者它可能是您之前的另一个事务锁定。

      其他:

      • 通过 using 完成连接、命令和阅读器后调用 dispose

      • 参数化第二个查询而不是字符串连接。由于 Sql Server 内部的工作方式,它更加安全且性能显着提高。

      • 次要:如果您要查看数千个项目,请使用 StringBuilder 而不是连接。

      【讨论】:

        猜你喜欢
        • 2020-04-26
        • 2020-03-14
        • 1970-01-01
        • 1970-01-01
        • 2020-07-21
        • 1970-01-01
        • 2021-05-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多