多线程:多个线程与同一表相互作用



面试问题

说,我们有一张桌子上有200万张记录,我们需要削减每位员工的10%的薪水(需要进行一些处理(,然后将其保存回收集。您如何有效地进行。

我问他,我们可以将执行程序框架用于相同的框架来创建多个线程,这些线程可以从表中获取值,然后我们可以对其进行处理并将其保存到列表。

然后他问我,您将如何检查是否已经处理了唱片,我毫无疑问(如何做(。

即使我不确定我的方法是否良好。

请帮助。

您可以做的一件事是使用生产者/消费者类型的模型,其中您有一个线程可为其他线程喂食以要更新的记录。这样,您就不必担心重复处理。

考虑到所述问题的最佳方法是使用纯SQL,类似于:

update employees set
salary = salary * .9

很难想象需要对SQL无法处理的员工数据做些事情。

如果通过某些不良设计的怪癖,您确实需要对SQL绝对无法做的员工类型数据做些事情,那么您将打开一个光标,然后迭代rowset并通过它迭代同步更新,因此您只能通过数据。

在伪代码中:

cursor = forUpdate ("select for update * from employees")
while (cursor.next()) {
    cursor.salary = cursor.salary * .9
}

这是最简单,可能最快的执行方法。

---

关于记录

它只有2m行,这是一个"小"数量,因此大多数数据库都可以在一次交易中处理。但是,如果没有,请添加一个条款,例如where id between <start> and <end>到查询中,如果使用Shell脚本方法,将过程缩小到可记录的数量中。

如果使用代码方法,大多数数据库都允许您在保持光标打开时提交,因此只需提交每10k行左右。

关于锁定

与记录相似的方面。此类查询中的所有行在交易期间都锁定。鉴于需要这么长时间才能跑步,请选择一个安静的时间来跑步。如果真的很重要,那就块,但要意识到锁定是不可避免的。

我将加载在此表中,然后为状态添加列。默认情况下,您可以将此列设置为"未处理"。线程开始处理此员工后,它将将状态更改为"处理",然后完成后,它最终将其切换为"处理"。

有3个这样的状态也将使您可以将其用作锁定,以防止处理两次。

最新更新