트랜잭션이란 ?

모든 명령어의 성공 또는 실패 를 한꺼번에 모아서 처리 하는 것

명령어 중에 하나라도 실패하면 한 트랜잭션 내의 모든 명령어들이 무효화 (롤백) 됨

EX) 은행에서 돈을 송금하려고 할 때

  1. 내 계좌에서 돈을 출금
  2. 다른 계좌로 돈을 입금

하는 과정이 함께 일어 나야 하는데 2번 과정에서 에러가 발생해서 입금이 되지 않았다면 돈이 붕 떠버리는 사태가 일어나게 됨

=> 이 경우엔 1, 2 를 한 트랜잭션으로 묶어서 하나의 과정이라도 실패하면 롤백 되도록 해야함

트랜잭션의 성질 (ACID)

  1. Atomicity(원자성)
    트랜잭션은 부분적으로 완료 될 수 없으며, 전체가 다 되거나 아무것도 되지 않거나 둘 중 하나여야 한다

➡ 출금하는 것만 성공하고 입금 되는 건 성공하면 안됨

  1. Consistency(일관성)
    트랜잭션이 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지

➡ 계좌 이체 하기 전 진행 전의 돈의 합과 진행 후의 돈의 합이 같아야 함

  1. Isolation(독립성,격리성)
    트랜잭션을 수행 시 다른 트랜잭션의 연산 작업이 끼어들지 못하도록 보장

➡ 출금 후 다른 트랜잭션이 끼어 들어 내 계좌에 남아 있는 금액을 보지 못함

  1. Durablility(영속성,지속성)
    성공적으로 수행된 트랜잭션은 영원히 반영

➡ 완료 후 시스템 문제가 생기더라도 커밋이 되었다면 DB 에 영구적으로 반영

=> 하지만 ACID 원칙을 완벽하게 지키게 되면 동시성이 매우 떨어지기 때문에 완벽하게 지켜지지 않는 경우도 있음

그렇기 때문에 ACID 원칙을 희생하여 동시성을 얻을 수 있는 방법인 isolation Level (격리 수준) 을 제공함

💎 Rails 에서 트랜잭션 사용하는 법

ActiveRecord::Base.transaction do 
  ## 예외 발생 시 롤백 
rescue => e
 	## 예외 발생한 경우 처리 
end

transaction(isolation: :?)

:read_uncommited / :read_commited / :repeatable_read / :serializable

🌟 save, save! 메서드 차이

save : 저장 성공 여부를 true, false 로만 리턴

save! : 저장이 실패할 경우 예외 발생 

하기 때문에 트랜잭션 안에서는 save! 를 사용해야함 

☕️ 스프링에서 트랜잭션 사용하는 법

@Transactional

스프링에선 해당 어노테이션을 메소드, 클래스 위에 사용