2013-03-22 10 views
1

문제점을 발견 했으므로 잠금과 관련이 없습니다. 생산 과정에서 나는 직업을 갖고있는 것 같습니다. 영구적으로 작동하는 작업입니다. 그 과정에서 처리되는 모든 일은 다른 곳에서 뭔가를 할 것입니다! 그리고 어딘가 다른 데이터베이스가 내 데이터베이스가 아니므로 방금 죽여서 제대로 작동하기 시작했습니다.ruby ​​on rails - 다른 프로세스 ID가 지연된 작업이 동일한 열을 업데이트 함

죄송합니다. 시간을 낭비했습니다.


죄송합니다. 레일즈 2.3.8을 사용 중입니다.

동일한 행, 다른 백그라운드 프로세스의 동일한 열에 대한 비동기 업데이트가 있습니다. delayed_jobs gem을 사용하고 있습니다.

는 내가하고 싶은 것입니다 :

ActiveRecord::Base.connection.execute(
"Update table_name set column = column + #{updated_number} 
where id = #{self.id}"). 

내 데이터베이스는 MySQL은 내가 쓰는 테이블 이노입니다.

문제는 다른 지연된 작업에서 해당 쿼리를 실행하면 일부 데이터 증가분이 손실됩니다. 유의하십시오 (column = column + # {updated_number}) 나는 테이블의 현재 값을 증가시키고 싶습니다!

지연된 작업이 다른 프로세스에서 실행되기 때문에 레일 잠금을 사용하면 테이블에 안전하게 잠금을 수행 할 잠금 장치가있는 것과 같은 생각이 들었습니다.

또 다른 한가지는 잠금을 사용하는 것입니다. 제 개발 코드에서 3 번 레이크 작업을 실행합니다 : 그리고 나서 delayed_job 테이블에서 3 가지 다른 프로세스가 3 개의 작업을 잠근 것을 확인하고 작동하는 개발 코드입니다. 아주.

하지만 프로덕션 환경에서이 코드를 사용하면 작동하지 않습니다. 증분 데이터가 손실되었습니다.

답변

2

사용 pessimistic locking :

your_object.with_lock do 
    your_object.column += updated_number 
    your_object.save! 
end 

이 업데이트가 DB를 통해 동기화되어 있는지 확인합니다.

+0

죄송합니다. 레일 2.3.8에서 작업하고 있다는 것을 잊어 버렸습니다. with_lock을 사용할 수 없습니다. –

+0

하지만 자물쇠! 여전히 사용할 수 있습니다. 링크 된 문서 페이지에서 구현을 복사하기 만하면됩니다. –

+0

이미 구현을 시도한 –