假设我有一个数据库,其中包含应该运行的事件数据:
活动1 - 01:00
活动2 - 02:00 am
活动3 - 03:00 am
如果用户重新加载页面,则会在某些条件下触发这些事件(例如,如果他在凌晨04:00重新加载页面,则会触发所有事件)
如果玩家1和玩家2在凌晨04:00同时重新加载页面,会发生什么:
两者都从数据库中获取这些事件。
两者都运行这些事件。
=>事件加倍。
当然,一旦事件完成,它就会被删除,但只要脚本没有完成事件,它就会保留在数据库中,如果他们重新加载页面,其他玩家也会运行它们。
有没有办法通过例如对SQL说“嘿,请阻止id 1,2和3选择”?
答案 0 :(得分:1)
您需要某种锁定机制来执行您想要的操作。这是一种机制,使用作业运行时的日志表。
第一个工作就是将一条记录插入到表中,说明它正在运行。
作业执行的第二次事情是检查当前是否还有其他作业在此作业之前启动。如果是这样,那么它会删除或更新其作业记录,因此没有任何内容正在运行。
作业所做的最后事情是更新/删除其记录,说它没有运行。
这些操作将充当锁定机制。
早于这项工作""部分逻辑应该消除竞争条件 - 假设时间上没有关系。您也可以使用自动递增的ID。
注意:当作业失败时,这可能会遇到问题。这可能是由于作业本身或服务器停机造成的。如果您知道运行时间总是少于10分钟(或左右),则可以将此逻辑合并到检查中。