解決SqlTransaction用盡的問題(SQL處理超時)

有時候程序處理的數據量比較小時,四平八穩,一切安然無恙,但數據量一大,原先潛伏的問題就暴露無遺了。
原訪問數據庫的代碼爲:
 1SqlConnection conn =  new SqlConnection(strConn);
 2conn.Open
();
 3SqlTransaction trans =
 conn.BeginTransaction();
 4
try
 5
{
 6    CEngine.ExecuteNonQuery(trans,CommandType.Text
,sql);
 7    trans.Commit
();
 8
}
 9
catch(SqlException ex)
10
{
11    trans.Rollback
();
12    ErrorCode = ex.Number
;
13    Info = "數據操做失敗:" +
 ex.Message;
14
}
15
finally
16
{
17
    trans.Dispose();
18    conn.Close
();
19

20

21

22

運行時,一旦出現數據量過大或者處理時間較長,則系統會提示出錯。錯誤提示爲「SqlTransaction已經用完;它不再能使用。

開始時,我懷疑是跟內存有關。由於系統須要作好事務回滾的準備,每執行一條插入或修改的SQL,都要有必定的開銷,數據量一大,恐怕就吃不消了。不過我查了一下SQL SERVER的資料,未見提到內存的問題。
後來想到,數據庫鏈接SqlTransaction有個時間問題。默認是15秒。數據量大的時候,這個時間極可能就不夠了。因而改成:
 1SqlConnection conn =  new SqlConnection(strConn);
 2conn.Open
();
 3SqlTransaction trans =
 conn.BeginTransaction();
 4
try
 5
{
 6    SqlCommand cmd =
 new SqlCommand();
 7    cmd.CommandType = CommandType.Text
;
 8    //
鏈接時限改成300秒
 9    cmd.CommandTimeout = 300
;
10    cmd.CommandText =
 sql;
11    cmd.Connection =
 conn;
12    cmd.Transaction =
 trans;
13
    cmd.ExecuteNonQuery();
14    trans.Commit
();
15
}
16
catch(SqlException ex)
17
{
18    trans.Rollback
();
19    ErrorCode = ex.Number
;
20    Info = "數據操做失敗:" +
 ex.Message;
21
}
22
finally
23
{
24
    trans.Dispose();
25    conn.Close
();
26}
修改後在測試,問題解決:)
相關文章
相關標籤/搜索