카테고리 없음

Rails의 트랜잭션 처리를 이해하고 효과적으로 사용하는 방법

DKel 2024. 5. 16. 11:18
반응형

Rails의 트랜잭션은 데이터베이스의 무결성을 유지하는 데 매우 중요합니다. 트랜잭션을 사용하는 것으로, 일련의 조작을 「모두 성공할까, 모두 실패할까」의 어느 쪽인지에 보증합니다. 이것은, 복수의 데이타베이스 조작을 하나의 단위로서 취급해, 에러가 발생했을 경우에 모든 조작을 롤백할 수 있도록(듯이) 하기 (위해)때문에입니다.

# 거래의 기초
Rails는 ActiveRecord::Base.transaction 메서드를 사용하여 트랜잭션을 제어합니다. 예를 들어 다음과 같이 사용합니다.

ActiveRecord::Base.transaction do
end



이 블록 내에서 수행되는 모든 데이터베이스 작업은 단일 트랜잭션으로 처리됩니다.

# 트랜잭션 롤백
트랜잭션을 롤백하는 두 가지 주요 방법이 있습니다.

캡처되지 않은 예외가 발생한 경우 : 트랜잭션 블록 내에서 예외가 발생하고 캡처되지 않으면 트랜잭션이 자동으로 롤백됩니다.

ActiveRecord::Rollback 을 명시적으로 발생시킨다: 이 예외를 트랜잭션(transaction) 블록내에서 발생시키는 것으로, 의도적으로 롤백을 일으킬 수가 있습니다.

ActiveRecord::Base.transaction do
  raise ActiveRecord::Rollback
end



트랜잭션 블록의 반환 값은 블록의 마지막 표현식의 평가 결과입니다. 예를 들어, 다음과 같은 경우:

result = ActiveRecord::Base.transaction do
end



result는 트랜잭션 블록의 마지막 표현식의 결과입니다.

# 주의점
1. return 사용:
트랜잭션 블록 내에서 return 을 사용하면 트랜잭션 외부로 제어가 이동하여 트랜잭션 무결성이 손상될 수 있습니다. 대신 raise ActiveRecord::Rollback 을 사용하여 트랜잭션을 명시적으로 롤백해야 합니다.

ActiveRecord::Base.transaction do
  # ...
  return if some_condition
  # ...
end

ActiveRecord::Base.transaction do
  # ...
  raise ActiveRecord::Rollback if some_condition
  # ...
end


2. 거래 중첩:
Rails에서는 트랜잭션을 중첩할 수 있습니다. 그러나 내부 트랜잭션에서의 롤백은 외부 트랜잭션에 영향을 미치지 않습니다. 예외적으로 requires_new: true 옵션을 사용하여 내부 트랜잭션을 독립적으로 만들 수 있습니다.

ActiveRecord::Base.transaction do

  ActiveRecord::Base.transaction do
    # ...
    raise ActiveRecord::Rollback
  end

end



3. 롤백시 피드백:
ActiveRecord::Rollback은 외부로 전파되지 않으므로 사용자에게 피드백을 제공하려면 예외 처리 및 조건 분기를 적절하게 설계해야 합니다. 예를 들어, 트랜잭션 결과에 따라 사용자에게 메시지를 표시할 수 있습니다.

result = ActiveRecord::Base.transaction do
  # ...
  raise ActiveRecord::Rollback if some_condition
  # ...
end

unless result
  flash[:alert] = "Alert!"
end



트랜잭션은 복잡한 데이터베이스 작업을 안전하고 효율적으로 수행하는 중요한 도구입니다. 적절하게 사용하면 데이터 무결성을 유지하고 응용 프로그램의 안정성을 높일 수 있습니다. 이러한주의 사항을 이해하고 적절하게 거래를 활용하는 것이 중요합니다.

반응형