我们有一个 Web 应用程序(它是一个游戏),其中包含许多各种形式和元素,它们充当按钮并在服务器上触发一些操作。问题是,如果用户点击按钮太快或在两个选项卡中打开网站然后同时发出一些操作,用户有时会混淆我们的应用程序。我们有一些基本的保护——MySQL 事务,一些双击防止 Javascripts,但无论如何有时有些东西会跳过。当然,最好的方法是重新设计所有的 SQL 事务和支持功能,使其不会混淆系统。这种混乱的一个例子是同时发布两个更新 - 一个 Web 请求更改了数据库中的某些内容,但第二个请求仍然使用旧数据运行,因此 SQL 更新返回“受影响的行数为零” 因为第一个事务已经更改了数据库中的数据。显而易见的解决方案是在 UPDATE 之前再次读取数据以查看它是否仍需要更新,但这意味着在各处放置更多的双重 SELECT 查询,这不是一个好的解决方案 - 为什么要从 db 读取相同的数据两次?我们还考虑使用一些隐藏的令牌在服务器上比较每个更新请求并拒绝具有相同令牌 id 的操作,但这也意味着要触及很多代码位置,并可能将新错误引入系统,除了工作正常之外这一个问题。不是一个好的解决方案 - 为什么要从 db 读取相同的数据两次?我们还考虑使用一些隐藏的令牌在服务器上比较每个更新请求并拒绝具有相同令牌 id 的操作,但这也意味着要触及很多代码位置,并可能将新错误引入系统,除了工作正常之外这一个问题。不是一个好的解决方案 - 为什么要从 db 读取相同的数据两次?我们还考虑使用一些隐藏的令牌在服务器上比较每个更新请求并拒绝具有相同令牌 id 的操作,但这也意味着要触及很多代码位置,并可能将新错误引入系统,除了工作正常之外这一个问题。
动作流的逻辑如下:如果用户同时发出两个请求,第二个请求应该等到第一个请求完成。但是我们还必须考虑到我们的应用程序中有很多重定向(例如在 POST 之后以避免用户刷新页面时重复 POST),因此该解决方案不应为用户造成死锁。
所以问题是:什么是最简单的全局修复,它可以以某种方式使所有用户操作按顺序进行?有什么好的通用解决方案吗?
我们正在使用 MySQL 和 PHP。