2008-09-23 3 views
6

전체 휴식 동사가 모든 포괄적 인 단일 트랜잭션 아래에있는 경우입니까? 즉, UPDATE, DELETE 또는 CREATE 작업을 처리하는 중 어느 시점에서나 유효성 검사 또는 콜백 오류가 발생하면 이전 콜백에서 수행 한 모든 데이터베이스 작업도 롤백됩니까? 간단히 말해 콜백이나 유효성 검사에서 오류를 발생시키지 않으면 해당 동사 작업에 대한 데이터베이스에서 전혀 변경 사항이 발생하지 않습니다.(평온한) 레일을 사용할 때 트랜잭션이 시작되는시기

답변

3

전체 휴식 동사가 하나의 포괄적 인 트랜잭션 아래에있는 경우입니까?

아니 내가 UPDATE의 취급의 어느 지점에서 확인 또는 콜백에서 오류가 발생하는 경우, DELETE 또는 작업을 CREATE

, 내가 이전에 수행 한 수있는 모든 데이터베이스 작업입니다 콜백도 롤백 되었습니까?

번호

어떤 콜백 또는 유효성 검사 확인에 오류를 제기하지 모두에서 변화가 동사의 행동에 대한 데이터베이스에서 발생하지 않도록? 당신은 당신이 명시 적으로 컨트롤러에서 트랜잭션을 생성 할 수 있습니다이 동작을 원하는 경우

번호

는 (다른 사용자에 의해 제공되는 예 참조), 또는 당신의 편안한 행동에 행동을 연결하는 around_filter를 사용합니다.

1

일부 메소드 (작성, 삭제)는 즉시 데이터베이스로 이동합니다. 거래는 다음과 같이 액티브에서 파생 된 클래스에 거래 방법을 사용하여 발생합니다. (이 예제에서는 여러 데이터베이스에 대한 단일 데이터베이스의 경우, 당신은 단지 하나의 트랜잭션이 필요합니다.)

Student.transaction do 
    Course.transaction do 
    course.enroll(student) 
    student.units += course.units 
    end 
end 

그런 다음 롤백 할 수 있습니다 이러한 트랜잭션에서 트랜잭션 내에서 발생한 예외는 롤백 후에 전파됩니다.

이것은 트랜잭션이있는 데이터베이스에 따라 다릅니다.

NB : 저장 및 삭제는 트랜잭션으로 래핑됩니다.

+0

그런 거래를 중첩 할 필요가 없습니다. .transaction에 대한 호출은 ActiveRecord :: Base에 전달됩니다. 당신은 문자 그대로 ActiveRecord :: Base.transaction을 두 번 호출하고 있습니다. –

+0

이것은 레일 문서의 예제입니다. –

+0

아! 여러 데이터베이스에 필요하다는 것을 알았습니다. 업데이트 됨. –

4

기본적으로 트랜잭션 내에 데이터베이스 코드가 작성되어 있지 않으므로 코드에서이를 수행하도록 지시해야합니다.

def create 
    Model.transaction do 
    Model.create!(params[:model]) 
    Model.association.create!(params[:association]) 
    end 
    rescue ActiveRecord::RecordNotSaved, ActiveRecord::RecordInvalid 
    flash[:notice] = "That record could not be saved." 
    render :action => "new" 
end 

#create! 메소드는 레코드를 저장하려고 시도하고 실패하면 예외를 발생시켜 트랜잭션 블록 내부에서 이미 수행 된 코드를 롤백합니다.

만약 당신이 행동을 구출하지 않으면 당신의 퍼블릭 디렉토리에있는 405.html이있는 경우 리디렉션됩니다.

관련 문제