레일즈(rails)에서 transation ROLLBACK 처리 문의사항

조회수 768회

raise ActiveRecord::ROLLBACK 이 구문을 써주는것과 안써주는것의 차이가 무었인가요?

아래 예문에서 CREATE! 에서 오류 발생시 자동으로 ROLLBACK 되는것으로 알고있는데 raise ActiveRecord::ROLLBACK 구문을 써주는 경우와 안써주는 경우의 차이점

그리고 raise ActiveRecord::ROLLBACK 구문은 어느경우에 사용해 주는지 알고싶습니다.

def create_thing_in_a_tx

BEGIN

ActiveRecord::Base.transaction DO
  a = ModelA.new(foo: 'bar')
  b = ModelB.new(a_record: a, biz: 'baz')
  #... various other logic that doesn't really belong in a model ...
  ThingModel.create!(b_record: b)
END
# The transaction COMMIT has happened.  Do your after commit logic here.

rescue

# The transaction was aborted with a ROLLBACK.  
# Your after commit logic above won't be executed.

raise ActiveRecord::ROLLBACK <-- 이부분 써주는것과 안써주는것의 차이

END END

1 답변

  • 좋아요

    0

    싫어요
    채택 취소하기

    질문하신 것만 우선 설명해드리자면

    rescue에 어떤 에러에 대한 예외처리인지 받지 않았기 때문에 모든 메서드의 모든 구문에서 어떤 에러가 나더라도 그 에러를 다시 ActiveRecord::Rollback를 에러로 처리하기 위해서 사용하고 있는 것 같습니다

    다만 이 경우 트랜잭션이 들어가기 전에 난 에러도 ActiveRecord::Rollback Exception 처리가 되기 때무넹

    사실 더 좋은 방법은 아래처럼 실제 트랜잭션 안에서만 호출하는겁니다.

    ActiveRecord::Base.transaction do
      a = ModelA.new(foo: 'bar')
      b = ModelB.new(a_record: a, biz: 'baz')   #... various other logic that doesn't really belong in a model ...
      ThingModel.create!(b_record: b)
    rescue
      # 여기에 롤백 전에 실행해야 할 것을 실행합니다.
      # 예를 들면 로그 남기기
     #  Rails.logger.debug 'Transaction Exception'
      raise ActiveRecord::Rollback
    end
    

    질문하신 부분에서 생략할 경우 어떻게 되냐고 물으셨는데

    만약 ActiveRecord::Rollback를 생략하고 rescue 안에서 raise 할 경우 최초의 예외처리해야할 Exception으로 돌려줍니다.

    예를 들면

    begin
      raise ActiveRecord::RecordNotFound
    rescue
      raise
    end
    

    이렇게 구문에서 ActiveRecord::RecordNotFound 예외처리 발생시 rescue에서 raise 하게 될 경우 ActiveRecord::RecordNotFound를 리턴합니다.

    정리하자면..

    • rescue에 어떤 Exception에 대한 처리인지 정확히 명시하지 않으면 모든 Exeception을 처리하기 때문에 모든 에러를 동일한 예외처리로 만들기 위한 구문이라고 보면 됩니다.
    • rescue 내에서 raise만 할 경우엔 최초 예외처리 하기 위한 에러를 다시 던져줍니다. (상위에서 처리하기 위해 자주 씁니다.)
    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 감사합니다. 답글을 늦게 봤는데 도움이 되었습니다. 김현덕 2019.10.8 15:56

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)