行级锁定,或在读取时锁定

时间:2016-06-12 04:42:08

标签: mysql sql multithreading concurrency

我的应用程序实例很少,每个实例都有一个从MySql表中选择未处理项的线程,并开始处理它。表结构如下:

id   |   status  | other_params
     |           |             
     |           |

'状态'字段将表示条目是否已处理。

我正面临着如何问题,我将确保当一个实例/线程从表中获取一个条目时,没有其他线程选择该条目进行处理。

我想到了将状态更改为“处理”的解决方案。和“处理过的”#39;完成后,但是为了使更改对其他线程可见,我需要提交。如果处理请求的节点失败,它将永远是“处理”。

此外,操作操作繁重,因此我不想要多个线程来完成任务。

任何人可以提供的想法都会有所帮助。

3 个答案:

答案 0 :(得分:1)

  

如何,我将确保当一个实例/线程获取一个条目时   从表中,没有其他线程选择该条目进行处理。

您可以通过提供行级锁定来实现。还要锁定等待超时。

假设您有两个线程T1,T2,它们试图从表中选择相同的未处理项。如果T1由于任何原因而失败,则事务将超时并且锁定将被释放。在这种情况下,T2可以去处理它。

答案 1 :(得分:1)

您是否考虑过在行表上获得悲观锁定?您还必须在事务中执行此操作才能使其正常工作。

select * from your_table where id=1 for update;

以下是悲观锁定的一些链接

manual

stackvoerflow

答案 2 :(得分:0)

请考虑工作线程模型。

主线程将在特定时间间隔内运行以获取未处理的记录并将其移交给工作线程。

成功处理后,将{(1}}状态标记为range是工作线程的责任。

主线程还应该缓存它发送给工人的reocord的id。(需要将它们删除以便后续执行)