首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

解決 SqlTransaction 超時失效:CommandTimeout 延長實戰

     編輯:PHP 相關知識

現象

小量資料正常,大量資料/長時間處理時拋出:
「SqlTransaction 已經用完;它再也不能使用。」

根因分析

  • 初步懷疑記憶體/回滾日誌開銷,查閱文檔無相關說明
  • 鎖定 SqlCommand.CommandTimeout 預設 30 秒(非連線逾時 ConnectionTimeout 15 秒)
  • 大批次操作超過 30 秒導致命令逾時,Transaction 被標記為不可用

修正前代碼(有缺陷)

SqlTransaction trans = conn.BeginTransaction();
try {
    CEngine.ExecuteNonQuery(trans, CommandType.Text, sql);  // 無設定 Timeout
    trans.Commit();
} ...

修正後代碼(關鍵:顯式設定 CommandTimeout)

SqlTransaction trans = conn.BeginTransaction();
try {
    SqlCommand cmd = new SqlCommand();
    cmd.CommandType = CommandType.Text;
    cmd.CommandTimeout = 300;  // 延長至 5 分鐘
    cmd.CommandText = sql;
    cmd.Connection = conn;
    cmd.Transaction = trans;
    cmd.ExecuteNonQuery();
    trans.Commit();
} catch (SqlException ex) {
    trans.Rollback();
    // 錯誤處理
} finally {
    trans.Dispose();
    conn.Close();
}

驗證結果

測試大量資料場景,問題徹底解決。

補充知識

  • ConnectionTimeout:建立連線等待上限(預設 15 秒)
  • CommandTimeout:命令執行等待上限(預設 30 秒)
  • 長時間批次作業務必同時評估兩者,並考慮分批提交避免長鎖定
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved