亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

多線程:多個線程與同一個表交互

多線程:多個線程與同一個表交互

搖曳的薔薇 2023-03-02 10:27:24
面試題比如說,我們有一張 Employee 表中有 200 萬條記錄的表,我們需要削減每個員工 10% 的工資(需要做一些處理),然后將其存回集合。你怎么能有效地做到這一點。我問他我們可以使用執行器框架來創建多個線程,這些線程可以從表中獲取值,然后我們可以處理并將其保存到列表中。然后他問我你將如何檢查記錄是否已被處理,我對此一無所知(怎么做)。即使我不確定我是否擅長我的方法。請幫忙。
查看完整描述

3 回答

?
飲歌長嘯

TA貢獻1951條經驗 獲得超3個贊

給出問題的最佳方法是使用純 SQL,例如:


update employees set

salary = salary * .9

很難想象需要對 SQL 無法處理的員工數據執行某些操作。


如果由于某種不良設計的怪癖,您確實需要對 SQL 絕對無法執行的員工類型數據執行某些操作,那么您將打開一個指向行集的游標并遍歷它,同步進行更新,這樣您只需執行一次傳遞數據。


在偽代碼中:


cursor = forUpdate ("select for update * from employees")

while (cursor.next()) {

    cursor.salary = cursor.salary * .9

}

這是最簡單且執行速度可能最快的方法。


—-


關于日志記錄

它只有 2M 行,這是一個“小”數量,因此大多數 DB 可以在單個事務中處理它。但是,如果沒有,請添加一個 where 子句,例如,where id between <start> and <end>如果使用 shell 腳本方法,則將過程分塊到可記錄的數量的查詢中。


如果使用代碼方法,大多數數據庫允許您在保持游標打開的情況下提交,因此只需每 10K 行左右提交一次。


關于鎖定

與日志記錄類似的方面。在事務期間,此類查詢中的所有行都被鎖定。鑒于跑步需要那么長時間,請選擇一個安靜的時間跑步。如果這真的很重要,請分塊,但要意識到鎖定是不可避免的。


查看完整回答
反對 回復 2023-03-02
?
天涯盡頭無女友

TA貢獻1831條經驗 獲得超9個贊

您可以做的一件事是使用生產者/消費者類型模型,其中您有一個線程工作以向其他線程提供要更新的記錄。這樣您就不必擔心重復處理。



查看完整回答
反對 回復 2023-03-02
?
FFIVE

TA貢獻1797條經驗 獲得超6個贊

我會加載到這個表中,然后為狀態添加一列。默認情況下,您可以將此列設置為“未處理”。一旦線程開始處理該員工,它會將狀態更改為“正在處理”,然后在完成后最終將狀態切換為“已處理”。

擁有 3 個這樣的狀態還可以讓您將其用作鎖,防止處理發生兩次。


查看完整回答
反對 回復 2023-03-02
  • 3 回答
  • 0 關注
  • 222 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號