2013-03-24 1 views
0

누군가가 포트폴리오에 주식을 추가 할 때마다 activerecord import gem을 사용하여 주가 기록을 가져옵니다. 주가 기록을 추가하기 전에 함수는 먼저 해당 주식이 테이블에 이미 있는지 확인합니다. 그렇게하면 2 명의 사람들이 Google 주식을 보유하고 있어도 주가 기록을 두 번 채우지 않습니다.activerecord-import gem은 동시 가져 오기를 어떻게 처리합니까? 테이블을 잠그고 있습니까?

그러나 이것은 동시에 추가 할 생각입니다. 2 명이 동시에 Google을 추가했고 가격 내역이 모델에없는 경우 '가져 오기'기능이 동시에 두 번 발생합니다.

내 질문에 나를 데려다 준다. activerecord-import는 동시에 2 개의 import를 방지하기 위해 테이블을 lock합니까?

편집 : StockHistory에 가져 오는 기능을 실행하기 위해 after_save을 사용 그래서 같은 StockHistory을 잠글 내 주식 모델에서

:

def populatepricehistory 

#columns and prices defined here 

StockHistory.transaction do 
    StockHistory.lock 
    StockHistory.import columns,prices 
end 

답변

1

activerecord-import 짐의 조언을 바탕으로 내가 아래 않았다 명시 적 잠금 자체를 수행하지 않습니다. 동시성 (concurrency)으로 무엇인가를한다면, 명시 적으로 격리시키는 것이 가장 좋습니다. 업데이 트를 ActiveRecord transaction에 래핑하십시오. ActiveRecord의 pessimistic locking 메커니즘을 사용하여 잠금에 대해 더 명확하게 말할 수도 있지만, 대부분의 경우에는 필요하지 않습니다. 트랜잭션 중 하나가 실패하고 실패를 처리하는 것이 더 나은 경우가 많습니다. 트랜잭션에서

포장은 간단합니다 :

# Inside ActiveRecord model Foo: 

def some_bulk_update 
    foo_records = generate_some_foo_records() 
    transaction do 
    self.import foo_records 
    end 
end 

그것은 충돌 창을 줄이기 위해 트랜잭션 외부에서 당신이 할 수있는만큼 많은 일을하는 것이 좋습니다. generate_some_foo_records()은 가져 오기 foo_records의 배열을 만들기 위해 트랜잭션 전에 메소드를 호출하는 방법의 예에 불과합니다.

자세한 내용은 위의 두 링크를 확인하십시오.

+0

Ty. 필자가 작성한 내용에 따라 필자의 기능으로 내 질문을 업데이트했습니다. 그것은 꽤 똑바로 보인다하지만 그것은 동시 수정 오류를 혼자서 복제하는 것이 어렵 기 때문에 나는 이중 검사를 원했다. 그 기능에 문제가있는 것을 보시겠습니까? 또한 레일 가이드에 따르면 .lock은 Exclusive로 Lock을 의미합니다. 그냥 postgresql과 같은 LOCK WITH EXCLUSIVE가 맞는지 확인하기 위해서입니까? Lock을 사용할 때 Postgresql의 기본 Lock이 Access Exclusive로 Lock되어 있기 때문에 나는 묻습니다. 그래서 레일즈 잠금이 다른 타입으로 기본 설정되어 있는지 확인하기를 원합니다. –

+0

그건 나에게 잘 어울려. 어떤 잠금 메커니즘을 사용할 것인지, 또는 잠금 메커니즘을 선택하는 방법을 모르지만 코드를 실행하고 레일 로그에서 생성하는 SQL을 살펴 보는 것이 가장 쉬운 방법입니다. –

+0

TY 선생님. 나는 그렇게 할 것이다! –

관련 문제