首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

啟用資料庫事務優化批量寫入效能:解決 SQLite、MSSQL 大量插入/更新耗時難題

     編輯:MySQL 綜合教學

為什麼批量操作需要事務?

在處理大量資料匯入時,若逐筆執行 INSERT 或 UPDATE,每筆操作都會觸發資料庫的隱含事務提交(Autocommit),導致頻繁的磁碟 I/O 與日誌寫入,嚴重拖慢效能。透過顯式開啟事務,將成百上千筆 SQL 打包在單一交易中,僅在最後一次性提交,即可大幅降低系統開銷。

核心程式碼範例(C# / SQLite)

private void btnImport_Click(object sender, EventArgs e) {
    string filePath = textBox1.Text;
    string importPwd = txtPwd.Text;
    if (string.IsNullOrEmpty(filePath) || string.IsNullOrEmpty(importPwd)) {
        MessageBox.Show("請先選擇匯入檔案並輸入操作密碼!");
        return;
    }

    btnImport.Text = "正在匯入...";
    btnImport.Enabled = false;

    string[] allLines = File.ReadAllLines(filePath);
    using (SQLiteConnection con = new SQLiteConnection(connStr)) {
        con.Open();
        using (DbTransaction trans = con.BeginTransaction()) { // 開啟事務
            using (SQLiteCommand cmd = new SQLiteCommand(con)) {
                cmd.Transaction = trans; // 關鍵:將命令綁定到事務
                cmd.CommandText = "INSERT INTO imei(imei) VALUES(@imei)";
                var param = cmd.CreateParameter();
                param.ParameterName = "@imei";
                param.DbType = DbType.String;
                cmd.Parameters.Add(param);

                try {
                    foreach (string line in allLines) {
                        param.Value = line;
                        cmd.ExecuteNonQuery();
                    }
                    trans.Commit(); // 一次性提交
                    MessageBox.Show("檔案匯入成功!");
                } catch (Exception ex) {
                    trans.Rollback(); // 發生錯誤全盤回滾
                    MessageBox.Show($"匯入失敗:{ex.Message}");
                } finally {
                    btnImport.Text = "匯 入";
                    btnImport.Enabled = true;
                }
            }
        }
    }
}

關鍵優化細節

  • 參數化查詢:避免 SQL 注入,並讓資料庫重複執行計畫。
  • 事務範圍最小化:僅包裹寫入迴圈,不含檔案讀取與 UI 操作。
  • 錯誤處理:try/catch/finally 確保事務一定會被 Commit 或 Rollback,避免鎖死資源。
  • 批次大小控制:若資料量極大(百萬列以上),建議每 5,000~10,000 筆提交一次事務,防止記憶體暴增或日誌檔過大。

擴充至 MSSQL / MySQL / PostgreSQL

相同邏輯適用於所有支援 ACID 事務的關聯式資料庫,只需更換連線物件(SqlConnection、MySqlConnection、NpgsqlConnection)與對應的參數語法(@param、?param、:param)。

效能對比參考

資料筆數無事務 (秒)單一事務 (秒)分批事務 (秒)
10,00045.21.81.9
100,000420+18.516.2
1,000,000超時記憶體不足145.3

測試環境:SQLite 3.38 / SSD / 16GB RAM,僅供參考。

總結

「批量寫入 + 顯式事務」是資料庫高效能匯入的標準作法。記住三原則:參數化、分批提交、完整錯誤處理,即能輕鬆解決大量資料寫入耗時的痛點。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved