2012-04-03 52 views
0

我在我的應用程序中使用MS Sql數據庫,當我從數據庫執行SELECT操作時,它會搜索幾分鐘。 它每天發生幾次。所有其他SELECTS只需幾秒鐘。數據庫卡在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();      
      } 
+0

'part_used'是你的'Parts'表的索引嗎?這將避免表掃描。在不指定ORDER的情況下,有一個「TOP」子句是不尋常的。 – HABO 2012-04-03 15:17:09

回答

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

這是最有可能,因爲鎖。如果另一個事務正在寫入Parts表中,則您的選擇需要等待。

0

零件表有多大?這可能會導致性能問題。或者它可能是另一個在你面前鎖定的交易。

其他的事情:當通過使用

  • 參數化第二次查詢,而不是字符串concating與他們做了你的連接,命令和讀者

    • 調用Dispose。由於Sql Server的內部工作原理,它更安全,性能更高。

    • minor:如果您正在查看數千個項目,請使用StringBuilder而不是連接。