2010-04-23 2 views
12

더 나은 정보를 기록하고 올바른 오류 메시지를 작성하여 클라이언트로 돌아가려면 시작 ... 복구 블록을 내 컨트롤러 작성 메소드에 추가하여 메소드를 작성하고 싶습니다. 구조가 어떤 식 으로든 롤백 프로세스에 '방해'합니까?시작 ... 구조를 사용하면 레일이 롤백됩니까?

레일즈가 자동으로 롤백을한다고 가정합니다. 언제 그런 일이 일어 납니까? 구조 절에 올 때까지 이미 일어 났습니까?

저는 DreamOS에서 mySQL을 사용하고 있으며 innoDB를 사용하고 있다고 생각합니다.

+0

이 응답에서 봐 주시기 바랍니다 : http://stackoverflow.com/questions/14329877/render-failing-to-render-correct-template-in-rescue-from- activerecordrollback/35731832 # 35731832 – monteirobrena

답변

0

그냥 begin ... rescue을 사용하면 트랜잭션을 롤백하는 것으로 충분하지 않습니다.

ModelName.transaction do 
end 

이 작업은 저장 호출에 명시 적으로 수행되므로 모든 콜백이 함께 실행됩니다. 구조 블록에서 어떤 예외가 있습니까? 너는 무엇에 반응하고 있니? 어떤 종류의 오류입니까?

+0

교착 상태에 빠졌습니다. 나는 그것을 묘사 할만큼 충분한 공간이 없을 것이라고 생각합니다. 그것은 카드 게임을위한 것입니다. 그러나 내 PlayerAction 모델의 after_save 콜백 메서드에서 다른 PlayerAction 인스턴스를 만듭니다. 관련 모델에 교착 상태가 발생합니다. 그런 일이 생길 때, 나는 처음 만들어진 PlayerAction 모델과 생성 된 관계를 포함하여 모든 것을 롤백하고 싶습니다. 레일이 자동 거래를하지 않는다고 말하는 것 같군, 그렇지? 명시 적으로 시작하고 롤백을 트리거해야합니까? 이것에 대한 자원이 있습니까? 나는 ... – user26270

+0

명시 적 트랜잭션을 수행하지만 save 및 update_attributes와 같은 메소드에 대해서만 수행합니다. 따라서 after_save는 동일한 트랜잭션에서 실행됩니다. – jonnii

+0

교착 상태에 대해 제안해야 할 것이 무엇인지 모르겠다. 때로는 다시 교착 상태를 피할 수있다. 교착 상태가 발생하면 다시 시도 할 수있는 몇 가지 플러그인이 있습니다 (http://github.com/rails/deadlock_retry). 그것들을 볼 가치가 있을지도 모른다. – jonnii

14

나는 이것을 실험 해왔다. 당신의 구조가 롤백을 일으킨 예외를 잡는다면, 이미 일어난 트랜잭션의 부분이 커밋 된 것처럼 보입니다. 내 경우에는 트랜잭션을 시작하기 전의 상태로 데이터베이스를 롤백하고 싶지만 여전히 예외를 처리하려고합니다.

은 이걸로 끝났다 :

self.transaction do 
    first_operation 
    begin 
    operation_that_might_violate_db_constraint 
    rescue ActiveRecord::RecordNotUnique 
     #deal with the error 
     raise ActiveRecord::Rollback #force a rollback 
    end 
end 

raise ActiveRecord::Rollback 부분은 트랜잭션이 완전히 롤백됩니다 확인합니다. 그것이 없다면, first_operation에서의 변화는 끝날 것입니다.

ActiveRecord :: Rollback은 트랜잭션 수준 위에 버블 링되지 않는 특별한 종류의 예외이므로 오류 페이지를 렌더링하는 캐치되지 않은 예외로 끝나지는 않습니다.

나는이 작업을 수행하는 황금 표준 방법인지는 확실하지 않지만 작동하는 것 같습니다.

+0

트랜잭션 블록 내부에서 예외를 catch하고 전자 메일을 보내는 것처럼 구조에서 무언가를하고 싶다면 트랜잭션이이를 방지하기 때문에 오류가 발생합니다. –

-2

또한 롤백, 캐치에 대한 내 대답을 시도 할 수 있습니다 및 액티브를 사용하여 만드는 방법 :: Base.transaction에 대한 렌더링 : - Click Here

감사

-1

롤백 처리 할 수 ​​없음.

예 :

create_table "helps", :force => true do |t| 
    t.string "title",       :null => false 
    t.text  "content" 
end 

#Rails console 
Help.transaction do 
    Help.create! title: "aaa" 
    begin 
    Help.create! content: "111" 
    rescue 
    p "create error." 
    end 
    Help.create! title: "bbb" 
end 

#get this 
>> "create error." 
Help.count 
>> 2 
관련 문제