2017-11-15 5 views
-1

은 내가 설명 할 수없는 내 Sails.js App에서 뭔가 발견 : 클라이언트가 UserController에 GET 요청을 전송GET 요청이 원자하지만 POST하지 Sails.js DB 트랜잭션에

을의 UserController가 생성하는 이 사용자에 대한 TransactionTable에서 새로운 기록이 계정이 0보다 크고 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"); 
     } 
}) 
나는 GET 요청에 대한 클라이언트 측에 루프 (5repeats을)했다

과는 1 트랜잭션을 생성 다른 4 명은 foundUser.account가 0 인 로그를 얻었습니다. 결과는 다음과 같습니다 :

당신은 돈을 얻을 것이다!

죄송가없는만큼 동전을

충분한 동전을

이 없어 죄송합니다

충분한 동전을

죄송가없는만큼 동전을

가 없습니다 죄송합니다

POST로 동일한 루프를 수행하여 테이블에 5 개의 트랜잭션을 생성했습니다.

돈이 있습니다!

돈이 있습니다!

돈이 있습니다!

돈이 있습니다!

돈이 있습니다!

그래서 : GET 원자와 POST는 Sail.js 응용 프로그램에 없습니까? 그리고 생산을위한이 방법은 안전한가요?

편집 : GET 요청은 idempotent입니다. GET을 사용하여 동일한 루프를 테스트했지만 이번에는 각 요청에 대해 다른 값을 추가하고 5 개의 트랜잭션을 받았습니다.

돈이 있습니다!

돈이 있습니다!

돈이 있습니다!

돈이 있습니다!

돈이 있습니다!

이 멱등 류는 어떻게 작동합니까? 그것은 바로 캐싱과 관련이 없습니다. 왜냐하면 첫 번째 GET 예제 에서처럼 이미 알려진 요청에 대한 응답을 캐싱 할 때 첫 번째 예제는 동일한 응답을 5 번 반환하기 때문입니다. 그러나 실제로 서버의 리소스를 "변경"하고 다른 응답을 제공합니다. 이상한.

이 문제를 어떻게 해결할 수 있습니까? 그래서 한 트랜잭션이 작성되면 다른 클라이언트가 요청할 수 없습니까?

답변

0

이것은 돛 특정 질문이 아니지만 HTTP가 몇 가지 동작을 구현하는 방법입니다. 다음을보십시오 : LINK1, LINK2.

+0

"멱등 열차 연산은 동일한 입력 매개 변수로 두 번 이상 호출하면 추가 효과가없는 연산입니다." - 매번 다른 매개 변수로 GET을 반복했는데 같은 결과가 발생했습니다. 그래서 새로운 해결책이 필요합니다. 감사합니다 – Suisse

1
이 단점입니다 대해 정말 돛처럼, 그러나 내 인터넷 검색에, 난 항상이 문서를 통해 실행

:

  1. 지원하지 않습니다 : 귀하의 질문에 관련성을 가질 수있는 문서에 언급 https://kev.inburke.com/kevin/dont-use-sails-or-waterline/

    두 가지를 트랜잭션의 경우 - 데이터베이스 업데이트시 경쟁 조건 방지 등. 이전 쓰기가 완료 될 때까지 최신 READ 작업을 보류하려고합니다. 트랜잭션이 제공하는 것입니다 (그러나 흘수선은 통하지 않습니다).

  2. 50ms 지연 POST 요청시마다

두 번째 문제는 조사한 적이 없지만 같은 50ms 간격으로 수신 된 게시물 요청을 한꺼번에 전달한다는 의미 일 수 있습니다.

+1

안녕하세요, Arbuth, 조심하세요! 이 기사는 2015 년 9 월에 나온 것입니다. 많은 것들이 바뀌 었습니다. 돛이 v0.10에있었습니다 (착각하지 않는 경우). 50ms의 설명은 여기 : https://github.com/balderdashy/sails/issues/3205 – paulogdm