我们有一个异步任务,它为一个对象执行潜在的长时间运行的计算。然后将结果缓存到对象上。为了防止多个任务重复相同的工作,我们添加了带有原子SQL更新的锁定:
UPDATE objects SET locked = 1 WHERE id = 1234 AND locked = 0
锁定仅适用于异步任务。对象本身仍然可以由用户更新。如果发生这种情况,对象的旧版本的任何未完成的任务都应该丢弃其结果,因为它们可能已过期。使用原子SQL更新也很容易做到这一点:
UPDATE objects SET results = '...' WHERE id = 1234 AND version = 1
我正在我的高并发应用程序中实现一个轻量级作业系统。为了简单起见,我将使用Postgres来管理系统中所有作业的状态。
我有一个表,其中进程可以通过布尔标志is_running将特定的作业标记为“运行”。如果多个进程试图运行同一作业,则只有其中一个进程应“获胜”。
我希望有一个原子语句,应用程序进程将调用该语句,试图将作业单独标记为正在运行。
UPDATE jobs SET is_running = true WHERE is_running = false AND id = 1
如果有一个带有(id=1, is_running=false)的单行,并且多个进程试图执行上述语句,那么多个进程是否