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