我正在创建一个小型多人游戏,玩家可以购买卡片。
在购买卡方法中,我正在做一系列异步请求,检查用户是否有足够的余额,如果游戏还没有启动等等。
然而,当我在我的控制台中执行此操作时:
for(var i = 0; i < 100; i++) {
$.post('api/card', {
game: '53ac5694edd697072c801228'
}, function (result) {
console.log(result);
});
}
用户可以绕过余额检查,因为当它仍在创建第一张卡时,第二个查询已经运行并确定余额仍为正数。
防止这种情况的最佳方法是什么?我正在使用Node.js和Express.js
答案 0 :(得分:0)
首先:如果他们可以确定余额仍然是正数,那么您的请求处理程序会执行不在事务中的事务(查询)。这是第一个也是最大的问题。修复此问题在服务器端。如果您使用的是SQL数据库,那么这将很容易。如果您使用的是非SQL数据库,那么由于您必须手动实现事务,因此很难。
其次:在完成第一个请求之前,您可以简单地禁止用户发出第二个请求。这可以通过在会话中保留布尔标志并且如果它是错误的响应(例如409 Conflict
)来轻松完成。但这样做只是为了提高性能/用户体验。交易更重要。