은 내가 설명 할 수없는 내 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 번 반환하기 때문입니다. 그러나 실제로 서버의 리소스를 "변경"하고 다른 응답을 제공합니다. 이상한.
이 문제를 어떻게 해결할 수 있습니까? 그래서 한 트랜잭션이 작성되면 다른 클라이언트가 요청할 수 없습니까?
"멱등 열차 연산은 동일한 입력 매개 변수로 두 번 이상 호출하면 추가 효과가없는 연산입니다." - 매번 다른 매개 변수로 GET을 반복했는데 같은 결과가 발생했습니다. 그래서 새로운 해결책이 필요합니다. 감사합니다 – Suisse