트랜잭션이란?
트랜잭션이란 ?
모든 명령어의 성공 또는 실패 를 한꺼번에 모아서 처리 하는 것
명령어 중에 하나라도 실패하면 한 트랜잭션 내의 모든 명령어들이 무효화 (롤백) 됨
EX) 은행에서 돈을 송금하려고 할 때
- 내 계좌에서 돈을 출금
- 다른 계좌로 돈을 입금
하는 과정이 함께 일어 나야 하는데 2번 과정에서 에러가 발생해서 입금이 되지 않았다면 돈이 붕 떠버리는 사태가 일어나게 됨
=> 이 경우엔 1, 2 를 한 트랜잭션으로 묶어서 하나의 과정이라도 실패하면 롤백 되도록 해야함
트랜잭션의 성질 (ACID)
-
- Atomicity(원자성)
- 트랜잭션은 부분적으로 완료 될 수 없으며, 전체가 다 되거나 아무것도 되지 않거나 둘 중 하나여야 한다
➡ 출금하는 것만 성공하고 입금 되는 건 성공하면 안됨
-
- Consistency(일관성)
- 트랜잭션이 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지
➡ 계좌 이체 하기 전 진행 전의 돈의 합과 진행 후의 돈의 합이 같아야 함
-
- Isolation(독립성,격리성)
- 트랜잭션을 수행 시 다른 트랜잭션의 연산 작업이 끼어들지 못하도록 보장
➡ 출금 후 다른 트랜잭션이 끼어 들어 내 계좌에 남아 있는 금액을 보지 못함
-
- 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
스프링에선 해당 어노테이션을 메소드, 클래스 위에 사용