天天看點

解決SqlTransaction用盡的問題

有時候程式處理的資料量比較小時,四平八穩,一切安然無恙,但資料量一大,原先潛伏的問題就暴露無遺了。

我做的一個項目,是負責一個廠的考勤的。廠裡有員工1000多号人。按每人每天打4次卡,一個月30天,則産生的考勤記錄數目為1000 * 4 * 30 = 120,000條。在處理這些記錄時,我采用的辦法是先生成SQL語句,然後執行這些SQL語句:

SqlConnection conn = new SqlConnection(strConn);
   conn.Open();
   SqlTransaction trans = conn.BeginTransaction();
   try  
   {
      CEngine.ExecuteNonQuery(trans, CommandType.Text, sql);
      trans.Commit();
   }
   catch(SqlException ex)
   {
      trans.Rollback();
      ErrorCode = ex.Number;
      Info = "資料操作失敗:" + ex.Message;
   }
   finally
   {
      trans.Dispose();
      conn.Close();
   }      

但運作的時候卻出錯。錯誤提示為“SqlTransaction已經用完;它再也不能使用。”

開始時,我懷疑是跟記憶體有關。因為系統需要做好事務復原的準備,每執行一條插入或修改的SQL,都要有一定的開銷,資料量一大,恐怕就吃不消了。不過我查了一下SQL SERVER的資料,未見提到記憶體的問題。

SqlConnection conn = new SqlConnection(strConn);
      conn.Open();
      SqlTransaction trans = conn.BeginTransaction();
      try
      {
           SqlCommand cmd = new SqlCommand();
           cmd.CommandType = CommandType.Text;
           //連接配接時限改為300秒
           cmd.CommandTimeout = 300;
           cmd.CommandText = sql;
           cmd.Connection = conn;
           cmd.Transaction = trans;
           cmd.ExecuteNonQuery();
           trans.Commit();
        }
        catch(SqlException ex)
        {
           trans.Rollback();
           ErrorCode = ex.Number;
           Info = "資料操作失敗:" + ex.Message;
        }
        finally
        {
           trans.Dispose();
           conn.Close();
        }