多執行緒修改資料的邏輯問題

2022-02-25 00:53:52 字數 1247 閱讀 4078

在實際開發過程中,不得已的情況下需要去更新資料庫某個或多個字段,假如需要更新的字段目標值是乙個固定值,那麼用update語句就可以實現,資料量比較大的情況下,一般也不會有問題。如果說需要更新的字段目標值是需要依賴同一條記錄其他欄位做一定計算的結果,這時可以選擇使用sql,也可使用**去實現。再如果說這個字段目標值是需要呼叫介面或其他不能直接計算出結果時(如某個加密值),這時就可以選擇**去實現,需要更新的資料量比較大時,則需要採用多執行緒的方式去更新。在實際實現的過程中遇到了乙個更新不成功的邏輯問題,雖然很快就發現了問題所在,還是秉著好記性不如爛筆頭的精神記錄下。

採用分頁獲取指定行數資料,如指定60行,分別交給不同執行緒去更新這60行的資料,更新的主鍵為每條資料的id,

執行緒池threadpoolexecutor核心引數按實際情況指定。

在更新過程中會出現的問題:某些記錄未成功更新,原因在後面進行說明,先放出部分測試**:

logger.info("需要更新總條數:{},分頁數:{},頁大小:{}",sumcount,times,num);

for(int i=0;iiterator = orderslist.iterator();

while (iterator.hasnext())

logger.info(thread.currentthread().getname() + "執行緒呼叫完成,更新範圍:index:{},num:{},更新條數:{}",index,num,orderslist.size());

}catch (exception e),num:{}", e.getmessage(), e);}}

}執**況:

從日誌能看出,執行緒11和12未獲取到響應記錄,從而導致這部分記錄未能更新成功;那麼問題的核心就是為什麼這部分的分頁資料未能獲取到。

相信看了原始碼的同學大概看出了問題的問題的所在,即多執行緒在執行的過程中,分頁查詢的條件中有乙個欄位phonetype既是查詢條件又是

需要更新的字段,也就是說部分執行緒在提交更改後,會導致此時分頁資料發生變化,就會導致

分頁查詢

不到資料的情況。

分頁查詢條件,可以根據實際情況去掉或用其他字段當做查詢條件,保證獲取的資料正確。

在用多執行緒更新時,一定要根據實際情況,避開邏輯漏洞

多執行緒之同時更改資料問題 啟用lock

using system using system.collections.generic using system.linq using system.text using system.threading using system.threading.tasks namespace thread...

修改資料 如何批量修改資料庫中的資料

如何在資料庫中動態刪除和建立資料表 第14講 在已有的資料表中刪除 新增 修改欄位的方法 第21講 根據工作表中的資料,生成資料庫中新的資料表的方法 第22講 向乙個已有的資料表中新增資料記錄的方法 第23講 把工作表中提供的資料在資料表中逐一刪除 可以是重複的記錄 的通用方法 第24講 把工作表中...

修改資料庫名稱 邏輯名稱 物理名稱

在測試環境,我們可能需要換庫,但又不想改配置裡資料庫的名稱,又不想刪除之前的資料。這時候,我們可以把原來的資料庫名稱改掉,作為乙個備份。但是,只是改資料庫名稱,是不行的,要經過三個步驟,才能完全將該庫變成其它名稱的庫。sql server 語句如下 修改資料庫名稱 邏輯名稱 物理名稱 檢視當前資料庫...