我有一个进程可以调用第三方系统来执行某些操作。我的用户可以在我的Web应用程序中安排这些调用,这会在我的数据库中插入一行。计划的进程将每小时检查我的数据库是否有任何未完成的请求,并尝试拨打第三方服务。用户还可以选择手动拨打他们在Web应用程序中安排的呼叫。
我想避免计划进程和用户同时尝试拨打电话的情况。为了增加这种安全性,我引入了不同的行状态:"等待"对于新行,"尝试"对于正在尝试的行,然后"完成"已完成的和"错误"对于那些失败的人。
尝试第三方通话的第一步是从"等待"更新状态。到"尝试"使用这样的SQL语句:
UPDATE remote_calls SET status = "trying" WHERE status = "waiting" AND id = ?;
如果受影响的行= 0,请退出。如果受影响的行= 1,请尝试拨打电话。因此,如果用户和预定进程尝试同时进行同一个呼叫,则只有一个将成功,另一个将退出。
这在我的测试盒上工作正常,但我发现它将部署在主 - 主复制环境中。我有问题吗?我担心如果用户的尝试和预定进程尝试更新不同的主服务器,则两个更新都将成功。这是一个合理的担心吗?如果是这样,有什么方法可以保证其中只有一个会成功吗?