2013-05-15 2 views
1

세션 해시 내에 배열을 추가했습니다. 문제는 때로는 여러 요청이 동시에 처리 (ajax)되고 요청이 배열에 대해 수행 한 변경이 두 번째 요청의 변경으로 대체된다는 것입니다. ,레일 세션이있는 레이스 조건

[63 :

가 63, 73, 92]

다음 첫 번째 요구가 무언가를 추가

실시 예는, 어레이는 먼저 다음과 같다 73, 92, 84]

두 번째 요청은 동일한 작업을 수행합니다 (하지만 분명 이전 버전에서 작동) : 그것은해야처럼

[63, 73, 92, 102]

그래서 결국 배열이 보이지 않는다. 그걸 피할 ​​수있는 방법이 있습니까? 캐시 저장소, 활성 레코드 저장소 및 쿠키 저장소를 사용하려고했습니다. 그들 모두와 같은 문제.

감사합니다.

+0

난 당신이 서버 측에서 무엇을하고 있는지 모르지만 무엇을 원하는 잠금 장치를 사용하여 요청을 잠 그려면 : // API .rubyonrails.org/classes/ActiveRecord/Locking/Optimistic.html – oldergod

답변

1

정말 레일스에서는 이것을위한 훌륭한 해결책이 없습니다. 나의 첫 번째 제안은 유스 케이스를 검사하고이 상황을 피할 수 있는지 확인하는 것입니다. 서버 측 세션 저장소를 처리 할 때 여러 가지 문제가 발생할 수 있으므로 세션 데이터를 클라이언트에 보관하는 것이 안전 할 경우 세션 데이터를 유지하는 것이 안전합니다. 다른 한편, 이것이 여러 페이지 요청 (그리고 아마 여러 세션)에서 장기간 유용 할 수있는 데이터라면 아마도 데이터베이스에 있어야합니다.

물론 세션에 실제로 속하는 데이터가 있습니다 (좋은 예는 현재 로그인 한 사용자입니다). 이 경우 http://paulbutcher.com/2007/05/01/race-conditions-in-rails-sessions-and-how-to-fix-them/, 구체적으로 https://github.com/fcheung/smart_session_store을 살펴보고 설명한 상황을 해결하려고합니다.

0
  1. 로드 현재 세션, 또는 새로 만들 필요
  2. 저장 나중에 참조 할 수 있도록
  3. 실행
  4. 과 함께 수정 된 세션을 비교 동작의 코드에 대한 수정되지 않은 세션의 복사하는 경우 변경된 내용을 확인하기 위해 이전에 저장된 사본
  5. 세션이 변경된 경우 :
    1. 세션 잠금
    2. 다시로드 세션
    3. 이 세션의 변경 사항을 적용하고 그것을
    4. Race conditions in Rails sessions and how to fix them에서 세션을

의 잠금을 해제 저장합니다.

0

그것은 단순한 경쟁 조건, 그냥 HTTP에 대한 redis locker

RedisLocker.new('my_ajax').run! { session[:whatever] << number } 
+0

자물쇠가 작동하려면 전체 요청 주위에 있어야한다고 생각합니다. – Joel