레일즈(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 답변
-
질문하신 것만 우선 설명해드리자면
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만 할 경우엔 최초 예외처리 하기 위한 에러를 다시 던져줍니다. (상위에서 처리하기 위해 자주 씁니다.)
-
(•́ ✖ •̀)
알 수 없는 사용자
댓글 입력