我的应用程序有几个实例,每个实例都有一个线程从 MySql 表中选取未处理的项目,并开始处理它。表结构如下:
id | status | other_params
| |
| |
“状态”字段表示条目是否已处理。
我面临着如何确保当一个实例/线程从表中选取一个条目时,没有其他线程选取该条目进行处理的问题。
我已经考虑过将状态更改为“正在处理”并在完成后更改为“已处理”的解决方案,但为了使更改对其他线程可见,我需要提交。如果处理请求的节点失败,它将始终处于“处理中”状态。
而且该操作是一项繁重的操作,因此我不希望有多个线程来执行该任务。
有人提供的任何想法都会有所帮助。
最佳答案
how, I will ensure that when one instance/thread picks up an entry from the table, no other thread picks that entry for processing.
您可以通过提供行级锁来做到这一点。还设置了锁等待超时。
假设您有 2 个线程 T1、T2,它们试图从表中选取相同的未处理项目。如果T1由于任何原因失败,事务将超时并且锁将被释放。这样的话,T2就可以去处理了。
关于mysql - 行级锁,或者读时锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37770795/