gpt4 book ai didi

mysql行级读锁替换消息队列

转载 作者:行者123 更新时间:2023-11-29 00:47:58 25 4
gpt4 key购买 nike

我有一个 mysql 表,我在其中存储要处理的作业。主要是原始数据的文本字段,每次处理大约需要一分钟。

我有 2 台服务器从该表中提取数据并对其进行处理然后删除。

为了管理我目前使用的 amazon SQS 的两台服务器之间的作业分配。我将所有需要处理的行 ID 存储在 SQS 中,工作服务器轮询 SQS 以获取要处理的新行。

该系统目前可以正常工作,但 SQS 增加了一层复杂性和成本,我认为这对于实现我正在做的事情来说太过分了。

我试图在没有 SQS 的情况下实现同样的事情,并且想知道是否有任何方法可以读取锁定一行,这样如果一个工作人员正在处理一行,其他工作人员就无法选择该行。或者有没有更好的方法。

最佳答案

一个简单的解决方法:在您的工作表中再添加一列,is_taken_by INT

然后在你的 worker 中你做这样的事情:

select job_id from jobs where is_taken_by is null limit 1 for update;
update jobs set is_taken_by = worker_pid where id = job_id;

选择 ... 进行更新 sets exclusive locks on rows it reads .这样您就可以确保没有其他 worker 可以从事相同的工作。

注意:您必须在显式事务中运行这两行。

Locking of rows for update using SELECT FOR UPDATE only applies when autocommit is disabled (either by beginning transaction with START TRANSACTION or by setting autocommit to 0. If autocommit is enabled, the rows matching the specification are not locked.

关于mysql行级读锁替换消息队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9776027/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com