2011-12-28 2 views
0

실제로 지불 받기 전에 비행기 좌석이 잠겨있는 것과 비슷한 요소를 "예약"하고 싶습니다. 최선의 방법은 데이터베이스를 통해, 그리고 ORM 계층에서 수행하는 것이 가장 좋습니다. 그래도 난 좀 더 유연한 솔루션을 필요로ActiveRecord를 사용하여 특정 시간 동안 행 예약하기

ActiveRecord::Base.transaction do 
    bar = Bar.find(1, :lock => true) 
    # do my stuff 
end 

:

다음은 예입니다. 여기

내가 그것을 개념적으로 일을 상상하고 방법은 다음과 같습니다

# action1: 
# put an expiring lock (30s) on an element (don't block unrelated code) 
# other code 

# action2 (after payment): 
# come back to the locked element to claim ownership of it 

UPDATE : 레일이 처음 built-in optimistic locking 기능을 사용하여 시도해야 할 시도하는 사람.

답변

2

추가 열 locked_until을 추가하십시오. 그러나 동시성에는주의하십시오. 나는 db 계층에서이 작업을 수행 할 것입니다.

+0

맞아, 나는 누가 그것을했는지 구별하기 위해'locked_by'와 함께'locked_until'을 사용할 수 있습니다. – m33lky

+0

ActiveRecord는 데이터베이스를 사용하여 잠금/트랜잭션을 수행합니다. 그것은 코드에서 올바르게 할 수 있고 다른 데이터베이스/SQL 구현에 대해 걱정할 필요가 없기 때문에 그렇게 좋았습니다. – m33lky

+0

나는 과거에는 너무 유사하지 않은 것들을 수행했고 locked_by/locked_since 열과 함께 2 개의 잠금 열에 대한 업데이트를위한 낙관적 잠금을 사용했습니다. –

0

이 목적을 위해 특별히 potential_owner이라는 별도의 테이블을 만들 수 있습니다. 타임 스탬프가있어 타이밍을 파악할 수 있습니다. 기본적으로 다음과 같이 작동합니다.

# lock the table 
# check latest record to see if the element is available 
# add a new record or die 

이것은 구현하기가 간단하지만 잠금은 세밀하지 않습니다. 이 표는 여러 요소의 잠재적 인 소유권을 설명하고 간단한 확인은 전체 표를 잠급니다. Tass의 솔루션에서는 특정 요소의 행만 잠겨 있습니다.

관련 문제