GET请求是原子的但是POST不在Sails.js数据库事务中

时间:2017-11-15 13:41:26

标签: node.js express post transactions sails.js

我在Sails.js应用程序中发现了一些我无法解释的内容:

客户端向UserController发送GET请求,如果UserController的帐户大于0,则UserController在该用户的TransactionTable中创建新记录,并将其帐户更新为0:

User.findOne(currentUser.id, function foundUser(err, foundUser) {
     if(foundUser.account > 0){
         //update the foundUsers account to 0
         User.update(foundUser.id, {account:0}, function updateUser(err, updatedUser) {
              //if error rollback;
             //save the User to the Transactions Table:
             Transactions.create(foundUser, function(){
                //if error rollback;
                return res.json("You will get Money!");  

              })
         })
      }else{
         return res.json("Sorry you don't have enough Coins");  
      }
})

我在Clientside上为GET请求做了一个循环(5次重复),它只创建了1个Transaction,另外4个得到了FoundUser.account为0的日志。 所以输出是:

  

你会得到钱!

     

抱歉,您没有足够的硬币

     

抱歉,您没有足够的硬币

     

抱歉,您没有足够的硬币

     

抱歉,您没有足够的硬币

我使用POST执行相同的循环,并在表中创建了5个事务。

  

你会得到钱!

     

你会得到钱!

     

你会得到钱!

     

你会得到钱!

     

你会得到钱!

那么:GET原子和POST不在Sail.js应用程序中吗?这种生产安全吗?

编辑: GET请求是idempotent - 我使用GET测试了相同的循环,但这次我为每个参数请求添加了一个不同的值,得到了5个事务。

  

你会得到钱!

     

你会得到钱!

     

你会得到钱!

     

你会得到钱!

     

你会得到钱!

这种幂等如何运作?它与缓存无关吗?因为当它只是缓存已知请求的响应时,如第一个GET示例中那样,第一个示例也会返回相同响应的5倍?但它实际上“改变”了服务器上的资源并提供不同的响应。奇怪。

如何解决此问题?因此,在编写一个交易时,没有其他客户可以提出请求吗?

2 个答案:

答案 0 :(得分:1)

我真的很喜欢帆,但是在我的谷歌搜索中,我总是碰到这篇关于它的缺点:https://kev.inburke.com/kevin/dont-use-sails-or-waterline/

文章中提到的两件事可能与您的问题有关:

  1. 不支持交易 - 防止数据库更新中的竞争条件等。您似乎想要暂停更新的READ操作,直到先前的WRITE完成 - 这是交易所提供的(但是水线不会使用吨)
  2. 每次POST请求延迟50ms
  3. 我从未调查过第二个问题,但也许这意味着在同一个50毫秒间隔内收到的帖子请求会被收集并一次性传递出来?

答案 1 :(得分:0)

这不是Sails特定的问题,而是HTTP如何实现某些行为。请看一下:LINK1LINK2