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

TA貢獻1797條經驗 獲得超6個贊
我會加載到這個表中,然后為狀態添加一列。默認情況下,您可以將此列設置為“未處理”。一旦線程開始處理該員工,它會將狀態更改為“正在處理”,然后在完成后最終將狀態切換為“已處理”。
擁有 3 個這樣的狀態還可以讓您將其用作鎖,防止處理發生兩次。
添加回答
舉報