C# 中的 SQL 並行違規錯誤

April 6, 2021

在寫資料庫讀寫指令的過程遇到此錯誤,在此紀錄 SQL 並行違規發生的可能原因與處理方式。

錯誤訊息

錯誤為 System.Data.DBConcurrencyException,訊息可能如下:

  • 並行違規: 批次作業的命令已經影響必須是 2 記錄的 0。
  • 並行違規: UpdateCommand 已經影響必須是 1 記錄的 0。

(數字可能會因為資料數量不同而有所變動)

遇到的錯誤

  • 從已有的 DataTable 複製 DataRow 時,連同狀態一同複製,且呼叫了更新資料的指令。由於該 DataTable 並沒有該筆資料,DataAdapter 原本應插入新 DataRow,卻變成試圖更新不存在的 DataRow,導致發生錯誤。在此情形下,可檢查 RowState 是否為 Added,若 RowState 為 Modified 或其他值,則可能發生錯誤。

其它可能原因

  • 資料無法關聯,例如 Table B 的 Primary Key 無法對應到 Table A 的 Foreign Key。
  • 在一次交易 (Transcation) 內多次的執行更新指令 (Update Command) 。
  • 有兩個或以上的使用者同時存取同一筆紀錄時造成。

解決方式

  • 由於當初是使用 DataTable.ImportRow() 複製資料列,並呼叫 DataAdapter 儲存包含新資料列的資料表,由於 RowState 也一同複製 (沒有改變為 Added),因此發生錯誤。
  • 改用其它方式複製 DataRow 即可解決。

參考資料