필자의 레일 애플리케이션에서 다음과 같은 코드가 있습니다.작업을 위해 일련의 개체를 잠 그려면 어떻게해야합니까?
def foo
if object_bar_exists
raise "can't create bar twice!"
end
Bar.create
end
두 가지 요청이 응용 프로그램 서버로 들어 오면 호출 될 수 있습니다. 이 코드가 동시에 두 요청에 의해 실행되고 두 코드가 동시에 if
검사를 실행하면 둘 다 다른 bar
을 찾지 않고 2 bar
가 작성됩니다.
"모음 모음"에 대해 "뮤텍스"를 만드는 가장 좋은 방법은 무엇입니까? DB에있는 특수 목적의 뮤텍스 테이블?
여기서 메모리 상호 배제는 사용할 수 없다는 것을 강조합니다.
나는 거래가 그 내부의 모든 것이 원자 적으로 수행되는 것을 보장한다고 생각했다. 동일한 트랜잭션을 사용하는 코드를 병렬로 두 프로세스에서 실행할 수없고 동일한 문제가 있습니까? (최초의'if' 검사가 병렬로 실행되고 성공하면, 그리고 병렬 적으로 쓰기가 일어나며, 두 경우 모두 각각의 코드가 원자 적으로 발생합니다.) –
행을 잠그지 않을 경우. 이것은 DB에서 행 수준 잠금이므로 다른 트랜잭션이 액세스 할 수 없습니다.또한 고유 한 행을 보장하는 유효성 검증 오류가있는 경우 첫 번째 쓰기가 성공하고 다음 번에 실패하여 전체 트랜잭션을 롤백합니다. –
정말로 ** 트랜잭션 ** 및 ** 데이터베이스 내에서 고유 한 인덱스를 사용하여 문제가 발생하게하십시오. 일이 잘못 될 때 트랜잭션은 모든 것을 깨끗하게 유지할 것이고, 일이 잘못 될 때 고유 인덱스가 알려줄 것입니다. –