首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >读取数据库表的行上的锁

读取数据库表的行上的锁
EN

Stack Overflow用户
提问于 2013-11-01 20:26:12
回答 1查看 532关注 0票数 0

我正在尝试建立一个作业调度程序。我有一个作业列表,可以在2-3台不同的机器上按时间执行。因此,任何机器都可以挑选任何作业并执行它,只要它的next_execution_time < current_time。我将所有作业存储在一个数据库表中,并使用SELECT.... FOR UPDATE中的SQL来选择要执行的作业。

但这种方法的问题是,如果一个machine1选择了一个作业,因为只有写锁,其他机器也会选择执行相同的作业,但不能执行,因为它们将等待锁释放或发生锁超时。那么有没有办法让其他机器跳过这个作业,使用SQL锁来执行其他作业呢?是否不应在数据库中添加其他列?

Flow是这样的:

代码语言:javascript
复制
select a job and lock it -> execute the job -> release the lock

我正在使用ruby-on-rails来开发它。如果rails中没有-wait或set_lock_timeout =0。它可能会解决这个问题。如果真的存在。语法是什么?

EN

回答 1

Stack Overflow用户

发布于 2013-11-02 02:40:17

实际上,在mysql中,您有一个简单的方法来处理当前表,您需要在选择下一个任务时临时锁定表。我假设您在表中有一个列来标记已经开始/完成的任务,否则您可以使用与datetime相同的列来启动作业,以标记它已经完成/开始:

代码语言:javascript
复制
lock tables jobs write;

select * from jobs where start_time < current_time and status = 'pending' order by start_time;
-- be carefull here to check for SQL errors in your code and run unlock tables if an exception is thrown or something like that

update jobs set status = 'started' where id = the_one_you_selected_adobe;

unlock tables;

就是这样,多个并发线程/进程可以使用作业表来执行任务,而无需两个线程运行相同的任务。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19726738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档